spring boot2 配置 FastJsonHttpMessageConverter 不起作用
项目使用自定义 FastJsonHttpMessageConverter 进行API数据响应JSON转换器
在原来springboot1.X 版本中是可以生效,配置如下:
/** * 替换使用 FastJson 解析返回结果 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { /** * 1.先定义一个convert转换消息的对象 * 2.添加fastjson的配置信息,比如:是否要格式化返回的json数据 * 3.在convert中添加配置信息 * 4.将convert添加到converters当中 */ //1.先定义一个convert转换消息的对象 FastJsonJsonpHttpMessageConverter fastConverter = new FastJsonJsonpHttpMessageConverter(); //2.添加fastjson的配置信息,比如:是否要格式化返回的json数据 FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); //处理中文乱码问题(不然出现中文乱码) List<MediaType> fastMediaTypes = new ArrayList<MediaType>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); //3.在convert中添加配置信息 fastConverter.setFastJsonConfig(fastJsonConfig); //4.将convert添加到converters当中 converters.add(fastConverter); }
升级为springboot2后,响应 FastJsonHttpMessageConverter 未起作用,按对springmvc的了解 ,如果自定义不生效的话,应该是使用默认消息转换器。为验证想法,在配置中添加如下代码打印出消息转换器列表:
@Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { for (HttpMessageConverter<?> messageConverter : converters) { System.out.println(messageConverter); //2 } }
输出如下信息:
org.springframework.http.converter.ByteArrayHttpMessageConverter@433e3357 org.springframework.http.converter.StringHttpMessageConverter@4a1066a2 org.springframework.http.converter.StringHttpMessageConverter@37531849 org.springframework.http.converter.ResourceHttpMessageConverter@1cc4de0 org.springframework.http.converter.ResourceRegionHttpMessageConverter@54629d11 org.springframework.http.converter.xml.SourceHttpMessageConverter@66f4a841 org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@49ca7586 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@61a93e7c org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2a0a9212 com.dreamer.core.converter.FastJsonJsonpHttpMessageConverter@6a400857
可以看出自定义的消息转换器【FastJsonJsonpHttpMessageConverter】在列表最后。
根据消息转换器的应用规则,会顺序选择符合要求的消费转换器,MappingJackson2HttpMessageConverter 在 FastJsonJsonpHttpMessageConverter 前面,这样就会使用 MappingJackson2HttpMessageConverter 进行消费转换,为了确认想法正确,我在 MappingJackson2HttpMessageConverter -> writeInternal 方法进行了debug,运行后,确实与想法一致。
找到原因,那就只要把 自定义的消息转换器【FastJsonJsonpHttpMessageConverter】添加到 MappingJackson2HttpMessageConverter 前面就可以,而对于自定义的消息转换器配置还有另一种方式,如下
@Bean public HttpMessageConverters fastJsonHttpMessageConverters() { /** * 1.先定义一个convert转换消息的对象 * 2.添加fastjson的配置信息,比如:是否要格式化返回的json数据 * 3.在convert中添加配置信息 * 4.将convert添加到converters当中 */ //1.先定义一个convert转换消息的对象 FastJsonJsonpHttpMessageConverter fastConverter = new FastJsonJsonpHttpMessageConverter(); //2.添加fastjson的配置信息,比如:是否要格式化返回的json数据 FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); //处理中文乱码问题(不然出现中文乱码) List<MediaType> fastMediaTypes = new ArrayList<MediaType>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); //3.在convert中添加配置信息 fastConverter.setFastJsonConfig(fastJsonConfig); return new HttpMessageConverters(fastConverter); }
配置后,重启项目,看到项目中消息转换器列表打印如下内容:
com.dreamer.core.converter.FastJsonJsonpHttpMessageConverter@75652058
org.springframework.http.converter.ByteArrayHttpMessageConverter@30fa29ef
org.springframework.http.converter.StringHttpMessageConverter@7749f8a4
org.springframework.http.converter.ResourceHttpMessageConverter@5351785e
org.springframework.http.converter.ResourceRegionHttpMessageConverter@f6af58c
org.springframework.http.converter.xml.SourceHttpMessageConverter@6ebe10df
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@560a4974
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@e415863
这里就可以看出 自定义的消息转换器【FastJsonJsonpHttpMessageConverter】在 MappingJackson2HttpMessageConverter 前面 ,同时运行API,debug 是运行 FastJsonJsonpHttpMessageConverter -> writeInternal 方法 。