问题描述:
给Long类型指定了序列化类,序列化类主要功能是在序列化时将Long类型变为String字符串类型,但是序列化之后发现还是无效。
全局序列化配置 :
/**
* 全局序列化方式
*
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//fastjson的全局序列化方式
configureFastJsonHttpMessageConverter(converters);
}
/**
* fastjson的全局序列化方式
*
* @param converters
*/
private void configureFastJsonHttpMessageConverter(List<HttpMessageConverter<?>> converters) {
// 定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//配置Content-Type
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
// 添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNonStringKeyAsString
);
SerializeConfig serializeConfig = SerializeConfig.globalInstance;
serializeConfig.put(Long.class, com.alibaba.fastjson.serializer.ToStringSerializer.instance);
serializeConfig.put(Long.TYPE, com.alibaba.fastjson.serializer.ToStringSerializer.instance);
serializeConfig.put(Date.class, new CustomDateSerializer());
fastJsonConfig.setSerializeConfig(serializeConfig);
// convert添加配置信息.
fastConverter.setFastJsonConfig(fastJsonConfig);
// 将convert添加到converters当中.
converters.add(fastConverter);
}
问题分析:
1、在全局序列化配置中给Long类型指定了序列化类,但是由于Long类型数据是放入了ArrayList对象中,再进行序列化,导致序列化出现问题。
调试代码:
@GetMapping("/testJson2")
public String testJson2() {
List<Object> list = new ArrayList<>();
list.add(1440931124753108994L);
list.add(new Date());
return JSON.toJSONString(list);
}
原因分析:
由于ArrayList没有指定序列化类,序列化时会指定默认的序列化类ListSerializer。
使用ListSerializer序列化类时,如果List里面有Integer或Long类型的数据,那么对应的Integer或Long类型的数据不会使用自己的序列化类,哪怕指定了序列化类都不会使用。
问题解决:
重新写一个ArrayList的序列化类并继承CollectionCodec,重写write()序列化方法,然后在全局序列化配置中给ArrayList类指定写好的序列化类即可。
更详细的实现步骤请查看以下博客。
Spring Boot实现全局序列化配置(Jackson、FastJson)https://blog.csdn.net/qq_38974638/article/details/120513840