@RequestBody相关的HttpMessageConverter是如何进行java-type(被修饰入参)和Media-type(媒体类型)匹配的

这篇博客详细介绍了@RequestBody注解与HttpMessageConverter的工作原理。内容包括HttpMessageConverter的作用,如将HTTP请求体转化为对象,以及如何通过canRead()和canWrite()方法选择合适的converter。博主还讨论了Spring MVC默认提供的 converter,如StringHttpMessageConverter和MappingJackson2HttpMessageConverter,并解释了如何自定义和添加converter。此外,文章深入解析了RequestResponseBodyMethodProcessor在处理@RequestBody和@Responsebody中的角色。
摘要由CSDN通过智能技术生成

分为两个部分:

第一个部分,带你大致了解HttpMessageConverter是干嘛的

第二部分,讲一下converter是怎么工作的

Part1

1.基本api

requestBody-->ServletInputStream进来

responsetBody-->ServletOuputStream出去

2.作用

HttpMessageConverter的作用就是

把HTTP发送请求的报文请求体-->对象

把要返回到responseBdoy中的对象-->报文返回体

官方文档一句话概括:

HttpMessageConverter is responsible for converting from the HTTP request message to an object and converting from an object to the HTTP response body

3.接口源码

public interface HttpMessageConverter<T> {

    //读取媒体类型,text/html、application/json

    boolean canRead(Class<?> clazz, MediaType mediaType);

    //指定可以把clazz的类型返回,按照返回的媒体类型

    boolean canWrite(Class<?> clazz, MediaType mediaType);

    //该转换器支持的媒体类型

    List<MediaType> getSupportedMediaTypes();

    //把请求的信息转换为某对象

    T read(Class<? extends T> clazz, HttpInputMessage inputMessage)

            throws IOException, HttpMessageNotReadableException;

    //把某对象写到返回流,然后可以指定返回的媒体类型

    void write(T t, MediaType contentType, HttpOutputMessage outputMessage)

            throws IOException, HttpMessageNotWritableException;

}

这里有很多的实现类:我们来看一下

一般情况下,最常用的实现类有:

StringHttpMessageConverter、MappingJackson2HttpMessageConverter;而且springMVC会为我们默认生成一些converter

4.关于各个converter的作用,贴一个官方ref:https://docs.spring.io/spring/docs/4.3.22.RELEASE/spring-framework-reference/htmlsingle/#rest-message-conversion

5.例子:

@RequestMapping("/test")

@ResponseBodypublic String test(@RequestBody String reqBody) {

    return "reqBody'" + reqBody+ "'";

}

流程:

        @RequestBody注解只能有一个,当一个请求过来以后,首先进行类型判断

    =>reqBody前面是String类,所以这里可以使用StringHttpMessageConverter(通过判断请求的reqBody的类型,在这里是请求头里面的content-type)

    =>通过canRead()方法判断出使用哪个converter以后,直接用read方法,进行处理,拿到处理完以后的reqBody,返回到controller参数

同理

    <=现在有一个Bean或者别的格式的,要返回给responseBody,还是先判断媒体类型,canWrite(),用哪个converter进行转换

    <=然后用write()方法,把数据写到responseBody里面,这里用脚指头想就知道,肯定是用accept的请求头来自动写返回报文的content-type

6.实际情形

req:传json、传图片、传表单

response:返回json、返回图片

所以实际的converter并不需要很多种,根据你的业务来加

7.自定义converter

4.3.22-官方文档:

Customization of HttpMessageConverter can be achieved in Java config by overriding configureMessageConverters() if you want to replace the default converters created by Spring MVC, or by overriding extendMessageConverters() if you just want to customize them or add additional converters to the default ones.

如果想替换原来的converter,通过重写configureMessageConverters()这个方法

而如果你想添加一个自定义converter,通过重写extendMessageConverters()这个方法

8.添加Jackson的专门用于处理json的converter

我们现在要添加一个专门处理json的converter,下面来写一下

Part2

由于网上的资料,是在是鱼龙混杂,参差不齐,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值