之前代码里@JSONField是没有问题的,过了几天没有管它,今天跑时发现@JSONField失效了。。百度google了半天也没有我想要的结果。看了最近的代码提交历史,也没有发现有影响的代码。
fastJson的配置代码如下:
@Bean//使用@Bean注入fastJsonHttpMessageConvert public HttpMessageConverters fastJsonHttpMessageConverters(){ //1.需要定义一个Convert转换消息的对象 FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter(); //2.添加fastjson的配置信息,比如是否要格式化返回的json数据 FastJsonConfig fastJsonConfig=new FastJsonConfig(); // 显示null值 fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue); //3.在convert中添加配置信息 fastConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter=fastConverter; return new HttpMessageConverters(converter); }
无奈,只有通过还原代码到特定版本一个一个试了。最终发现有影响的代码是添加静态资源访问的一个类。代码如下:
但这个静态资源的配置按理说与fastJson没什么影响才对啊,看到WebMvcConfig,突然想起fastJosn还有一种配置方法,百度后,代码如下:
// 需要继承WebMvcConfigurerAdapter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat
);
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat ); fastConverter.setFastJsonConfig(fastJsonConfig); converters.add(fastConverter); }
我把fastJson的配置改成上面这种发现也不行。而且访问接口还会报错。
第一反应是这个静态资源的配置和fastJson的配置有冲突,一个是实现WebMvcConfigurer接口,一个是继承
WebMvcConfigurerAdapter 类。查了下发现
WebMvcConfigurerAdapter 这个类已经过时,springboot2.0应该实现
WebMvcConfigurer接口, 然后我看了下
WebMvcConfigurer接口的源码,发现里面也有configureMessageConverters这个方法。
这下原因就清楚了,因为静态资源的这个类没有重写
configureMessageConverters 这个方法,所以相当于是默认的,这个配置类加载时就把之前fastJson的配置给覆盖成默认的了。解决方法就是在这个类里重写
configureMessageConverters 即可。代码如下:
@Configuration @EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer { @Value("${tjzbk.upload.path}") private String static_save_path; /** * 上传资源路径访问配置 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/files/**").addResourceLocations(static_save_path); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( // // 防止循环引用 // SerializerFeature.DisableCircularReferenceDetect, // // 空集合返回[],不返回null // SerializerFeature.WriteNullListAsEmpty, // // 空字符串返回"",不返回null // SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteMapNullValue ); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); //处理中文乱码问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); converters.add(fastJsonHttpMessageConverter); } }