From ff0485596609fc17f661048325a4c5845b250aab Mon Sep 17 00:00:00 2001 From: thinkgem Date: Wed, 26 May 2021 12:59:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0JsonMapper=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E9=BB=98=E8=AE=A4=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=B9=B6=E5=85=BC=E5=AE=B9@JsonForm?= =?UTF-8?q?at=E6=B3=A8=E8=A7=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jeesite/common/mapper/JsonMapper.java | 46 +++++++++++++------ .../main/resources/config/jeesite-core.yml | 6 ++- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/jeesite/common/mapper/JsonMapper.java b/common/src/main/java/com/jeesite/common/mapper/JsonMapper.java index 7eec0cda..1f21c482 100644 --- a/common/src/main/java/com/jeesite/common/mapper/JsonMapper.java +++ b/common/src/main/java/com/jeesite/common/mapper/JsonMapper.java @@ -4,6 +4,9 @@ package com.jeesite.common.mapper; import java.io.IOException; +import java.lang.reflect.AnnotatedElement; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.TimeZone; @@ -13,6 +16,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser.Feature; @@ -23,10 +27,14 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.introspect.Annotated; +import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.util.JSONPObject; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import com.jeesite.common.collect.ListUtils; import com.jeesite.common.io.PropertiesUtils; +import com.jeesite.common.lang.DateUtils; /** * 简单封装Jackson,实现JSON String<->Java Object的Mapper. @@ -59,6 +67,31 @@ public class JsonMapper extends ObjectMapper { // 设置默认时区 this.setTimeZone(TimeZone.getTimeZone(PropertiesUtils.getInstance() .getProperty("lang.defaultTimeZone", "GMT+08:00"))); + // 设置默认日期格式 + this.setDateFormat(new SimpleDateFormat(PropertiesUtils.getInstance() + .getProperty("web.json.defaultDateFormat", "yyyy-MM-dd HH:mm:ss"))); + this.setAnnotationIntrospector(new JacksonAnnotationIntrospector() { + private static final long serialVersionUID = 1L; + @Override + public Object findSerializer(Annotated a) { + if (a instanceof AnnotatedMethod) { + AnnotatedElement m = a.getAnnotated(); + JsonFormat jf = m.getAnnotation(JsonFormat.class); + if (jf != null) { + return new JsonSerializer(){ + @Override + public void serialize(Date value, JsonGenerator jgen, + SerializerProvider provider) throws IOException, JsonProcessingException { + if (value != null){ + jgen.writeString(DateUtils.formatDate(value, jf.pattern())); + } + } + }; + } + } + return super.findSerializer(a); + } + }); // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 遇到空值处理为空串 @@ -69,19 +102,6 @@ public class JsonMapper extends ObjectMapper { jgen.writeString(StringUtils.EMPTY); } }); -// // 统一默认Date类型转换格式。如果设置,Bean中的@JsonFormat将失效 -// final String dataFormat = Global.getProperty("json.mapper.dataFormat"); -// if (StringUtils.isNotBlank(dataFormat)){ -// this.registerModule(new SimpleModule().addSerializer(Date.class, new JsonSerializer(){ -// @Override -// public void serialize(Date value, JsonGenerator jgen, -// SerializerProvider provider) throws IOException, JsonProcessingException { -// if (value != null){ -// jgen.writeString(DateUtils.formatDate(value, dataFormat)); -// } -// } -// })); -// } // // 进行HTML解码(先注释掉,否则会造成XSS攻击,比如菜单名称里输入转josn后就会还原这个编码 ,并在浏览器中运行)。 // this.registerModule(new SimpleModule().addSerializer(String.class, new JsonSerializer(){ // @Override diff --git a/modules/core/src/main/resources/config/jeesite-core.yml b/modules/core/src/main/resources/config/jeesite-core.yml index 48b2fad9..93124798 100644 --- a/modules/core/src/main/resources/config/jeesite-core.yml +++ b/modules/core/src/main/resources/config/jeesite-core.yml @@ -374,7 +374,7 @@ shiro: #contentSecurityPolicy: "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src 'self' 'unsafe-inline' 'unsafe-eval' data:" # 是否允许跨域访问 CORS,如果允许,设置允许的域名。v4.2.3 开始支持多个域名和模糊匹配,例如:http://*.jeesite.com,http://*.jeesite.net - accessControlAllowOrigin: '*' + #accessControlAllowOrigin: '*' # 允许跨域访问时 CORS,可以获取和返回的方法和请求头 #accessControlAllowMethods: GET, POST, OPTIONS @@ -590,6 +590,10 @@ web: id: '[a-zA-Z0-9_\-/#\u4e00-\u9fa5]{0,64}' user.loginCode: '[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}' + # 默认的日期格式(JsonMapper) + json: + defaultDateFormat: yyyy-MM-dd HH:mm:ss + # 默认不启用(为兼用旧版保留,建议使用 CORS) jsonp: enabled: false