分为两个部分:
第一个部分,带你大致了解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
由于网上的资料,是在是鱼龙混杂,参差不齐,