一、HttpMessageConverter是什么
@RequestBody、@ResponseBody注解,可以直接将输入输出解析成Json,这里其实就是HttpMessageConverter发挥着作用。
针对不同的消息形式,有不同的HttpMessageConverter实现类来处理各种消息形式,如feed,atom,xml,json,protobuf。
请求响应分别对应spring的HandlerMethodReturnValueHandler,HandlerMethodArgumentResolver 来处理。
二、StringHttpMessageConverter
@RequestMapping("/test")
@ResponseBody
public String test(@RequestBody String param) {}
因为传入传出都是string,所以使用了StringHttpMessageConverter。输入调用了canread,read()方法,输出调用了write()方法。
三、对象转json,默认使用MappingJackson2HttpMessageConverter
1. springboot 默认使用Jackson
![](https://i-blog.csdnimg.cn/blog_migrate/20acea026ad106c964d74b458c006bba.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b0866be8d1c8816ea4647dd7b0ed473c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/57132c4c27d41397a9dcde02c09dd9b6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d1dd9c1fff0ceb558a2b0ebbe4058e3.png)
2)springboot启动初始化convert代码路由
经验证,本路由真实有效,BackgroundPreinitializer 先运行。。 然后是WebMvcAutoConfiguration
public class BackgroundPreinitializer implements ApplicationListener<SpringApplicationEvent>
public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter {
可以看到 jackson排在gson, JSON-B 之前
四、为什么要替换为fastjson
五、替换的原理
![](https://i-blog.csdnimg.cn/blog_migrate/e1974bee6f9eca6ce106adefd5011098.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ac3a60c6b0a8fc911a7941627c217f16.png)
3.HttpMessageConverter匹配过程
HandlerMethodReturnValueHandler,HandlerMethodArgumentResolver 针对不同的类型找到不同的converter处理。
@RequestBody注解时: 根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据;
@ResponseBody注解时: 根据Request对象header部分的Accept属性(逗号分隔),逐一按accept中的类型,去遍历找到能处理的HttpMessageConverter;
六、 替换代码
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//添加fastJson的配置信息;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setCharset(Charset.forName("UTF-8"));
//值为null时也要输出
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.DisableCircularReferenceDetect);
//3处理中文乱码问题,这块儿可以有兴趣来验证下
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastMediaTypes.add(MediaType.parseMediaType(MediaType.TEXT_PLAIN_VALUE + ";charset=ISO-8859-1"));
//在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}