Browse Source

fix使用fastjson序列化

Eric 1 năm trước cách đây
mục cha
commit
71b0cd9904

+ 2 - 93
cooleshow-app/src/main/java/com/yonge/cooleshow/config/WebMvcConfig.java

@@ -1,26 +1,18 @@
 package com.yonge.cooleshow.config;
 
-import com.alibaba.fastjson.serializer.SerializerFeature;
-import com.alibaba.fastjson.support.config.FastJsonConfig;
-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.format.FormatterRegistry;
 import org.springframework.http.MediaType;
-import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.StringHttpMessageConverter;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,10 +31,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 	 */
 	@Override
 	public void addFormatters(FormatterRegistry registry) {
-		// 枚举转换器
 		registry.addConverterFactory(enumConverterFactory);
-		// 字符串时间转换器
-		//registry.addConverter(new JacksonConfig.CustomStringDateConverter());
 	}
 
 	@Override
@@ -54,86 +43,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		registry.addInterceptor(operationLogInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
 	}
 
-	/**
-	 * @param converters List<HttpMessageConverter<?>>
-	 */
-	@Override
-	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
-		//WebMvcConfigurer.super.configureMessageConverters(converters);
-
-		// 如果存在fastJson的转换器,将其移除
-		converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof MappingJackson2HttpMessageConverter);
-
-		// 需要重新加入jackson的转换器,该处的objectMapper已经在配置中注册了
-		MappingJSONHttpMessageConverter converter = new MappingJSONHttpMessageConverter(new JacksonConfig.JacksonObjectMapper());
-		converter.setDefaultCharset(StandardCharsets.UTF_8); // 字符编号
-		// converters.add(0, converter);
-
-		// 添加String转换器
-		//converters.add(utf8StringHttpMessageConverter());
-
-		// 添加fastJson转换器
-		// 1. 配置fastjson
-		FastJsonConfig config = new FastJsonConfig();
-
-		config.setDateFormat("yyyy-MM-dd HH:mm:ss");
-		config.setCharset(StandardCharsets.UTF_8);
-		config.setSerializerFeatures(
-				SerializerFeature.DisableCircularReferenceDetect,
-				SerializerFeature.QuoteFieldNames,
-				SerializerFeature.BrowserSecure,
-				SerializerFeature.WriteDateUseDateFormat,
-				//json格式化
-				SerializerFeature.PrettyFormat,
-				//输出map中value为null的数据
-				SerializerFeature.WriteMapNullValue,
-				//输出boolean 为 false
-				//SerializerFeature.WriteNullBooleanAsFalse,
-				//输出list 为 []
-				SerializerFeature.WriteNullListAsEmpty,
-				//输出number 为 0
-				SerializerFeature.WriteNullNumberAsZero,
-				//输出字符串 为 ""
-				SerializerFeature.WriteNullStringAsEmpty,
-				//对map进行排序
-				SerializerFeature.MapSortField
-		);
-
-		// 2. 添加fastjson转换器
-		LocalFastJsonHttpMessageConverter fastJsonHttpMessageConverter = new LocalFastJsonHttpMessageConverter();
-		fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);
-		fastJsonHttpMessageConverter.setFastJsonConfig(config);
-
-		List<MediaType> fastMediaTypes = new ArrayList<>();
-		fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
-		fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
-
-		converters.add(0, fastJsonHttpMessageConverter);
-	}
-
-	/**
-	 * 自定义String转换器
-	 * @return HttpMessageConverters
-	 */
-	//@Bean
-	//@Primary
-	public StringHttpMessageConverter utf8StringHttpMessageConverter() {
-
-		StringHttpMessageConverter converter = new StringHttpMessageConverter();
-
-		List<MediaType> mediaTypes = Lists.newArrayList();
-		mediaTypes.add(MediaType.TEXT_HTML);
-		mediaTypes.add(MediaType.TEXT_PLAIN);
-		mediaTypes.add(MediaType.TEXT_XML);
-		mediaTypes.add(MediaType.APPLICATION_XML);
-
-		converter.setSupportedMediaTypes(mediaTypes);
-		converter.setDefaultCharset(StandardCharsets.UTF_8);
-
-		return converter;
-	}
-
-	//@Bean
+	@Bean
 	public HttpMessageConverters fastJsonHttpMessageConverters() {
 		LocalFastJsonHttpMessageConverter converter = new LocalFastJsonHttpMessageConverter();
 		List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
@@ -141,5 +51,4 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		converter.setSupportedMediaTypes(fastMediaTypes);
 		return new HttpMessageConverters(converter);
 	}
-
 }

+ 1 - 1
cooleshow-auth/auth-server/pom.xml

@@ -33,7 +33,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.9</version>
+            <version>1.2.79</version>
         </dependency>
 
         <dependency>

+ 8 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/LocalFastJsonHttpMessageConverter.java

@@ -2,10 +2,12 @@ package com.yonge.cooleshow.auth.config;
 
 import com.alibaba.fastjson.serializer.JSONSerializer;
 import com.alibaba.fastjson.serializer.ObjectSerializer;
+import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
 import com.alibaba.fastjson.serializer.ValueFilter;
 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
 import com.vdurmont.emoji.EmojiParser;
 import com.yonge.toolset.base.enums.BaseEnum;
+import com.yonge.toolset.utils.json.JsonUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.HttpInputMessage;
 import org.springframework.http.HttpOutputMessage;
@@ -13,8 +15,10 @@ import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.http.converter.HttpMessageNotWritableException;
 
 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 {
 
@@ -28,12 +32,12 @@ public class LocalFastJsonHttpMessageConverter extends FastJsonHttpMessageConver
 	@Override
 	protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
 
-		/*OutputStream out = outputMessage.getBody();
+		OutputStream out = outputMessage.getBody();
 		JsonUtil.getConfig().put(Date.class, new SimpleDateFormatSerializer(FORMAT));
 		//JsonUtil.getConfig().put(String.class, new EmojiSerializer());
 		String text = JsonUtil.toJSONString(obj, EnumFilter.instance, getFeatures());
 		byte[] bytes = text.getBytes(getCharset());
-		out.write(bytes);*/
+		out.write(bytes);
 	}
 }
 
@@ -43,7 +47,7 @@ class EmojiSerializer implements ObjectSerializer{
 	public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
 		serializer.write(EmojiParser.parseToUnicode(object.toString()));
 	}
-	
+
 }
 
 class EnumFilter implements ValueFilter {
@@ -67,3 +71,4 @@ class EnumFilter implements ValueFilter {
 		return value;
 	}
 }
+

+ 10 - 61
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/WebMvcConfig.java

@@ -1,29 +1,22 @@
 package com.yonge.cooleshow.auth.config;
 
-import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
-import com.google.common.collect.Lists;
-import com.yonge.cooleshow.auth.config.jackson.JacksonConfig;
-import com.yonge.cooleshow.auth.config.jackson.MappingJSONHttpMessageConverter;
 import com.yonge.cooleshow.auth.interceptor.OperationLogInterceptor;
 import com.yonge.cooleshow.common.config.EnumConverterFactory;
 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;
 
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 
 @Configuration
 public class WebMvcConfig implements WebMvcConfigurer {
-	
+
 	@Autowired
 	private OperationLogInterceptor operationLogInterceptor;
 
@@ -32,64 +25,20 @@ public class WebMvcConfig implements WebMvcConfigurer {
 	 */
 	@Override
 	public void addFormatters(FormatterRegistry registry) {
-		// 枚举转换器
 		registry.addConverterFactory(new EnumConverterFactory());
-		// 字符串时间转换器
-		registry.addConverter(new JacksonConfig.CustomStringDateConverter());
 	}
-	
+
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
 		registry.addInterceptor(operationLogInterceptor).addPathPatterns("/userDevice/unbind").excludePathPatterns("/*");
 	}
 
-	/**
-	 * @param converters List<HttpMessageConverter<?>>
-	 */
-	@Override
-	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
-		//WebMvcConfigurer.super.configureMessageConverters(converters);
-
-		// 如果存在fastJson的转换器,将其移除
-		converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof FastJsonHttpMessageConverter);
-
-		// 需要重新加入jackson的转换器,该处的objectMapper已经在配置中注册了
-		MappingJSONHttpMessageConverter converter = new MappingJSONHttpMessageConverter(new JacksonConfig.JacksonObjectMapper());
-		converter.setDefaultCharset(StandardCharsets.UTF_8); // 字符编号
-		converters.add(0, converter);
-
-		// 添加String转换器
-		converters.add(utf8StringHttpMessageConverter());
-	}
-
-	/**
-	 * 自定义String转换器
-	 * @return HttpMessageConverters
-	 */
-	//@Bean
-	@Primary
-	public StringHttpMessageConverter utf8StringHttpMessageConverter() {
-
-		StringHttpMessageConverter converter = new StringHttpMessageConverter();
-
-		List<MediaType> mediaTypes = Lists.newArrayList();
-		mediaTypes.add(MediaType.TEXT_HTML);
-		mediaTypes.add(MediaType.TEXT_PLAIN);
-		mediaTypes.add(MediaType.TEXT_XML);
-		mediaTypes.add(MediaType.APPLICATION_XML);
-
-		converter.setSupportedMediaTypes(mediaTypes);
-		converter.setDefaultCharset(StandardCharsets.UTF_8);
-
-		return converter;
-	}
-
-	//@Bean
-    public HttpMessageConverters fastJsonHttpMessageConverters(){
+	@Bean
+	public HttpMessageConverters fastJsonHttpMessageConverters(){
 		LocalFastJsonHttpMessageConverter converter = new LocalFastJsonHttpMessageConverter();
-        List<MediaType> fastMediaTypes =  new ArrayList<MediaType>();
-        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
-        converter.setSupportedMediaTypes(fastMediaTypes);
-        return new HttpMessageConverters(converter);
-    }
+		List<MediaType> fastMediaTypes =  new ArrayList<MediaType>();
+		fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+		converter.setSupportedMediaTypes(fastMediaTypes);
+		return new HttpMessageConverters(converter);
+	}
 }

+ 3 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/config/jackson/JacksonConfig.java

@@ -51,9 +51,9 @@ import java.util.TimeZone;
 /**
  * JSON LocalDateTime 序列化、反序列化配置
  */
-@Configuration
-@ConditionalOnClass(ObjectMapper.class)
-@AutoConfigureBefore(JacksonAutoConfiguration.class)
+//@Configuration
+//@ConditionalOnClass(ObjectMapper.class)
+//@AutoConfigureBefore(JacksonAutoConfiguration.class)
 public class JacksonConfig {
 
     public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; // 时间格式

+ 1 - 1
cooleshow-user/user-biz/pom.xml

@@ -35,7 +35,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.9</version>
+            <version>1.2.79</version>
         </dependency>
 
         <dependency>

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

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.JSONSerializer;
 import com.alibaba.fastjson.serializer.ObjectSerializer;
 import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
 import com.alibaba.fastjson.serializer.ValueFilter;
 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
 import com.alibaba.fastjson.util.IOUtils;
@@ -20,6 +21,7 @@ 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,13 +36,10 @@ 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(Date.class, new SimpleDateFormatSerializer(FORMAT));
 		//JsonUtil.getConfig().put(String.class, new EmojiSerializer());
-		String text = JsonUtil.toJSONString(obj, EnumFilter.instance, SerializerFeature.BrowserSecure, SerializerFeature.WriteDateUseDateFormat);
-		byte[] bytes = text.getBytes(IOUtils.UTF8);
+		String text = JsonUtil.toJSONString(obj, EnumFilter.instance, getFeatures());
+		byte[] bytes = text.getBytes(getCharset());
 		out.write(bytes);
 	}
 }

+ 1 - 1
cooleshow-websocket/pom.xml

@@ -82,7 +82,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.9</version>
+            <version>1.2.79</version>
         </dependency>
     </dependencies>
 

+ 1 - 1
pom.xml

@@ -331,7 +331,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.9</version>
+            <version>1.2.79</version>
         </dependency>
 	</dependencies>
 

+ 1 - 1
toolset/utils/pom.xml

@@ -95,7 +95,7 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.9</version>
+            <version>1.2.79</version>
         </dependency>
 
         <dependency>

+ 21 - 43
toolset/utils/src/main/java/com/yonge/toolset/utils/json/JsonUtil.java

@@ -1,5 +1,13 @@
 package com.yonge.toolset.utils.json;
 
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.nio.charset.CharsetDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.parser.Feature;
@@ -10,15 +18,6 @@ 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;
-import java.nio.charset.CharsetDecoder;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 
 /**
  * 注意点: 如果存在对象间循环引用问题,解决办法: 将get方法的方法名非标准的名称,
@@ -35,7 +34,7 @@ public class JsonUtil {
 
 	/**
 	 * 将json字符串反序列化为指定对象
-	 * 
+	 *
 	 * @param <T>
 	 * @param text
 	 *            json串
@@ -51,7 +50,7 @@ public class JsonUtil {
 
 	/**
 	 * 将集合型json串转换成集合对象
-	 * 
+	 *
 	 * @param <T>
 	 * @param text
 	 *            json串
@@ -65,7 +64,7 @@ public class JsonUtil {
 
 	/**
 	 * 将字节数组转换成指定对象
-	 * 
+	 *
 	 * @param <T>
 	 * @param input
 	 *            需要转换的内容
@@ -83,7 +82,7 @@ public class JsonUtil {
 
 	/**
 	 * 忽略具体对象中的某些属性,将其他属性转换成json字符串
-	 * 
+	 *
 	 * @param object
 	 *            具体对象
 	 * @param ingnoreProperties
@@ -106,7 +105,7 @@ public class JsonUtil {
 
 	/**
 	 * 允许具体对象中的某些属性对应的值转换成json字符串
-	 * 
+	 *
 	 * @param object
 	 *            具体对象
 	 * @param allowProperties
@@ -128,22 +127,9 @@ 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();
+		SerializeWriter out = new SerializeWriter(SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.QuoteFieldNames,
+				SerializerFeature.SkipTransientField, SerializerFeature.WriteEnumUsingToString, SerializerFeature.SortField);
 		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);
@@ -152,7 +138,7 @@ public class JsonUtil {
 
 	/**
 	 * 将传入的List&lt;JSONObject&gt;改为List&lt;Object&gt;
-	 * 
+	 *
 	 * @param jsonList
 	 *            传入的List&lt;JSONObject&gt;
 	 * @param clazz
@@ -163,7 +149,7 @@ public class JsonUtil {
 		List<T> objList = new ArrayList<T>();
 		if (jsonList != null && jsonList.size() > 0) {
 			for (int i = 0; i < jsonList.size(); i++) {
-				T val = TypeUtils.castToJavaBean(jsonList.get(i), clazz, null);
+				T val = TypeUtils.castToJavaBean(jsonList.get(i), clazz);
 				objList.add(val);
 			}
 		}
@@ -184,19 +170,11 @@ public class JsonUtil {
 
 	public static String toJSONString(Object object, SerializeConfig config, ValueFilter filter, SerializerFeature... features) {
 
-		// SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteMapNullValue, SerializerFeature.QuoteFieldNames, SerializerFeature.WriteNullNumberAsZero
-		SerializeWriter out = new SerializeWriter();
+		SerializeWriter out = new SerializeWriter(SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullStringAsEmpty,
+				SerializerFeature.WriteMapNullValue, SerializerFeature.QuoteFieldNames, SerializerFeature.WriteNullNumberAsZero);
 
-		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 : serializerFeatures) {
+		for (SerializerFeature feature : features) {
 			serializer.config(feature, true);
 		}
 		if (filter == null) {
@@ -217,7 +195,7 @@ public class JsonUtil {
 
 	/**
 	 * 可根据配置参数对目标对象进行转换成json字符串
-	 * 
+	 *
 	 * @param obj
 	 *            目标对象
 	 * @param configs