Converter和HttpMessageConveter是springboot和springmvc在处理请求的时候需要用到的。但是这两者的完全是不一样的,作用的地方也不一样。
1,springboot和springmvc处理请求的流程
先来回顾一下处理请求的流程:
可以看到填充Handler入参的时候用到Converter和HttpMessageConveter。那到底什么时候用Converter,什么时候用HttpMessageConveter呢?
2,GET和POST请求可以用来传递业务参数
get和post请求携带参数的支持方式是不同,如图:
上述的4个部分都是用HttpMessageConverter来进行类型转换的吗?不是的,HttpMessageConverter和Convert 各有分工, HttpMessageConverte只负责解析Http包的Body体部分,其余部分都交由相关的Convert处理。
HttpMessageConverter和Convert各自支持的部分如图:
除上表所示之外,SpringMVC还有一些需要Convert的场景,如读取Cookie值的@CookieValue(本质是Header),解析矩阵URL的@MatrixVariable(本质是URL),读取本地会话@SessionAttribute,解析SpEL的@Value。
所以,在处理请求时,HttpMessageConverter和Convert 分别用来反序列化请求的Body和非Body部分,即HttpMessageConverter是一套小型、独立、额外为用户提供的专门的Body体的类型转换器;而Convert 则与PropertyEditor类似,可以处理更为通用的类型转换。比如要将一个Body部分为json格式的字符串转换为对象,就需要HttpMessageConverter来做这件事情,因为不同的HttpMessageConverter才知道如何解析这种类型的Body,具体该Body能否被某个HttpMessageConverter所解析,要看这个HttpMessageConverter能否支持某个请求,或者某个响应的Content-Type。然后可以使用该HttpMessageConverter进行解析。将一个String类型的参数id转换成方法的Long类型参数id就使用Convert。另外在HttpMessageConverter解析Body部分的时候,其同样可能会用到Convert/Format的转换器,因为他内部在将Body转换为对象或者其他类型时,可能也会需要将字符串转化为整型数字。