Ver Fonte

update 更新 jackson 配置 支持 LocalDateTime 全局格式化

疯狂的狮子li há 3 anos atrás
pai
commit
c5d46591fe

+ 5 - 12
ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java

@@ -4,6 +4,9 @@ import cn.hutool.core.util.ArrayUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -15,20 +18,10 @@ import java.util.Map;
  *
  * @author 芋道源码
  */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class JsonUtils {
 
-    private static ObjectMapper objectMapper = new ObjectMapper();
-
-    /**
-     * 初始化 objectMapper 属性
-     * <p>
-     * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean
-     *
-     * @param objectMapper ObjectMapper 对象
-     */
-    public static void init(ObjectMapper objectMapper) {
-        JsonUtils.objectMapper = objectMapper;
-    }
+    private static ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
 
     public static String toJsonString(Object object) {
 		if (StringUtils.isNull(object)) {

+ 20 - 26
ruoyi-framework/src/main/java/com/ruoyi/framework/config/JacksonConfig.java

@@ -5,17 +5,18 @@ import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
-import com.ruoyi.common.utils.JsonUtils;
 import com.ruoyi.framework.jackson.BigNumberSerializer;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.TimeZone;
 
 /**
@@ -27,30 +28,23 @@ import java.util.TimeZone;
 @Configuration
 public class JacksonConfig {
 
+	@Primary
 	@Bean
-	public BeanPostProcessor objectMapperBeanPostProcessor() {
-		return new BeanPostProcessor() {
-			@Override
-			public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-				if (!(bean instanceof ObjectMapper)) {
-					return bean;
-				}
-				ObjectMapper objectMapper = (ObjectMapper) bean;
-				// 全局配置序列化返回 JSON 处理
-				SimpleModule simpleModule = new SimpleModule();
-				simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
-				simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
-				simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
-				simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
-				simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
-				simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
-				objectMapper.registerModule(simpleModule);
-				objectMapper.setTimeZone(TimeZone.getDefault());
-				JsonUtils.init(objectMapper);
-				log.info("初始化 jackson 配置");
-				return bean;
-			}
-		};
+	public ObjectMapper getObjectMapper(Jackson2ObjectMapperBuilder builder, JacksonProperties jacksonProperties) {
+		ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+		// 全局配置序列化返回 JSON 处理
+		SimpleModule simpleModule = new SimpleModule();
+		simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
+		simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
+		simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
+		simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat());
+		simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
+		simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
+		objectMapper.registerModule(simpleModule);
+		objectMapper.setTimeZone(TimeZone.getDefault());
+		log.info("初始化 jackson 配置");
+		return objectMapper;
 	}
 
 }