HttpMessageConverter原理,SpringBoot用FastJsonHttpMessageConverter替换默认的HttpMessageConverters

一、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

Spring Boot provides integration with three JSON mapping libraries:
• Gson
• Jackson
• JSON-B
Jackson is the preferred and default library.
 
2. 源码路径确认默认使用jackson
1) HttpMessageConverters构造器代码路由
 
当自定义的WebMvcConfiguration中初始化自定义的HttpMessageConverter时,会调用构造器,这个路由在 2)之后调用
 
HttpMessageConvertersAutoConfiguration
 HttpMessageConverters

WebMvcConfigurationSupport
getMessageConverters-->addDefaultHttpMessageConverters
 

 

2)springboot启动初始化convert代码路由

经验证,本路由真实有效,BackgroundPreinitializer 先运行。。 然后是WebMvcAutoConfiguration

public class BackgroundPreinitializer implements ApplicationListener<SpringApplicationEvent> 

 

public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter {

可以看到 jackson排在gson, JSON-B 之前

为什么要替换为fastjson

 
jackson 的key 默认忽略大小写,我们在requestmapping中实际需要返回真正的key值
使用lombok插件@Data注解生成类得getter,setter及构造方法,jackson是不支持json序列化的
 

替换的原理

 
 1. 所有自定义的都会添加到converters
 

 

2. 新增加的converters,同种类别的新增加的排名靠前
    注意:combined.addAll(0,processing)
 
  

 

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);
}

 

 
 
 
 
 
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值