소스 검색

fix使用fastjson2序列化

Eric 1 년 전
부모
커밋
def58698f3

+ 6 - 10
cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java

@@ -1,20 +1,16 @@
 package com.yonge.cooleshow.config;
 
-import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.config.LocalFastJsonHttpMessageConverter;
-import com.yonge.cooleshow.biz.dal.config.jackson.JacksonConfig;
-import com.yonge.cooleshow.biz.dal.config.jackson.MappingJSONHttpMessageConverter;
 import com.yonge.cooleshow.common.config.EnumConverterFactory;
 import com.yonge.cooleshow.interceptor.MDCInterceptor;
 import com.yonge.cooleshow.interceptor.OperationLogInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
 import org.springframework.format.FormatterRegistry;
 import org.springframework.http.MediaType;
-import org.springframework.http.converter.HttpMessageConverter;
 import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@@ -41,7 +37,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		// 枚举转换器
 		registry.addConverterFactory(enumConverterFactory);
 		// 字符串时间转换器
-		registry.addConverter(new JacksonConfig.CustomStringDateConverter());
+		//registry.addConverter(new JacksonConfig.CustomStringDateConverter());
 	}
 
 	@Override
@@ -56,7 +52,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 	/**
 	 * @param converters List<HttpMessageConverter<?>>
 	 */
-	@Override
+	/*@Override
 	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 		//WebMvcConfigurer.super.configureMessageConverters(converters);
 
@@ -70,14 +66,14 @@ public class WebMvcConfig implements WebMvcConfigurer {
 
 		// 添加String转换器
 		converters.add(utf8StringHttpMessageConverter());
-	}
+	}*/
 
 	/**
 	 * 自定义String转换器
 	 * @return HttpMessageConverters
 	 */
 	//@Bean
-	@Primary
+	//@Primary
 	public StringHttpMessageConverter utf8StringHttpMessageConverter() {
 
 		StringHttpMessageConverter converter = new StringHttpMessageConverter();
@@ -94,7 +90,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		return converter;
 	}
 
-	//@Bean
+	@Bean
 	public HttpMessageConverters fastJsonHttpMessageConverters() {
 		LocalFastJsonHttpMessageConverter converter = new LocalFastJsonHttpMessageConverter();
 		List<MediaType> fastMediaTypes = new ArrayList<MediaType>();

+ 5 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/LocalFastJsonHttpMessageConverter.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.config;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.JSONSerializer;
 import com.alibaba.fastjson.serializer.ObjectSerializer;
 import com.alibaba.fastjson.serializer.SerializerFeature;
@@ -19,7 +20,6 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
-import java.util.Date;
 
 public class LocalFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {
 
@@ -34,9 +34,12 @@ public class LocalFastJsonHttpMessageConverter extends FastJsonHttpMessageConver
 	protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
 
 		OutputStream out = outputMessage.getBody();
+		// fastjson2.2.7版本之后,需要手动配置SerializerFeature.WriteDateUseDateFormat特性
+		// 否则会导致序列化日期不正确
+		JSON.DEFFAULT_DATE_FORMAT = FORMAT;
 		//JsonUtil.getConfig().put(Date.class, new SimpleDateFormatSerializer(FORMAT));
 		//JsonUtil.getConfig().put(String.class, new EmojiSerializer());
-		String text = JsonUtil.toJSONString(obj, EnumFilter.instance, SerializerFeature.BrowserSecure);
+		String text = JsonUtil.toJSONString(obj, EnumFilter.instance, SerializerFeature.BrowserSecure, SerializerFeature.WriteDateUseDateFormat);
 		byte[] bytes = text.getBytes(IOUtils.UTF8);
 		out.write(bytes);
 	}

+ 23 - 1
toolset/utils/src/main/java/com/yonge/toolset/utils/json/JsonUtil.java

@@ -10,6 +10,7 @@ import com.alibaba.fastjson.serializer.SerializeWriter;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.alibaba.fastjson.serializer.ValueFilter;
 import com.alibaba.fastjson.util.TypeUtils;
+import com.google.common.collect.Lists;
 
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
@@ -128,8 +129,21 @@ public class JsonUtil {
 
 	private static String toJsonString(Object obj, ValueFilter filter) {
 		// SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.QuoteFieldNames, SerializerFeature.SkipTransientField, SerializerFeature.WriteEnumUsingToString, SerializerFeature.SortField
+
 		SerializeWriter out = new SerializeWriter();
 		JSONSerializer serializer = new JSONSerializer(out);
+
+		ArrayList<SerializerFeature> serializerFeatures = Lists.newArrayList(
+				SerializerFeature.DisableCircularReferenceDetect,
+				SerializerFeature.WriteNullStringAsEmpty,
+				SerializerFeature.WriteMapNullValue,
+				SerializerFeature.QuoteFieldNames,
+				SerializerFeature.WriteNullNumberAsZero
+		);
+		for (SerializerFeature feature : serializerFeatures) {
+			serializer.config(feature, true);
+		}
+
 		serializer.config(SerializerFeature.WriteEnumUsingToString, false);
 		serializer.getValueFilters().add(filter);
 		serializer.write(obj);
@@ -173,8 +187,16 @@ public class JsonUtil {
 		// SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteMapNullValue, SerializerFeature.QuoteFieldNames, SerializerFeature.WriteNullNumberAsZero
 		SerializeWriter out = new SerializeWriter();
 
+		ArrayList<SerializerFeature> serializerFeatures = Lists.newArrayList(
+				SerializerFeature.DisableCircularReferenceDetect,
+				SerializerFeature.WriteNullStringAsEmpty,
+				SerializerFeature.WriteMapNullValue,
+				SerializerFeature.QuoteFieldNames,
+				SerializerFeature.WriteNullNumberAsZero
+		);
+		serializerFeatures.addAll(Lists.newArrayList(features));
 		JSONSerializer serializer = new JSONSerializer(out, config);
-		for (SerializerFeature feature : features) {
+		for (SerializerFeature feature : serializerFeatures) {
 			serializer.config(feature, true);
 		}
 		if (filter == null) {