加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

springmvc的RequestResponseBodyMethodProcessor解析

(2018-06-19 09:39:55)
标签:

it

java

spring

springmvc

分类: spring技术
前面分析了springmvc对一些基本的请求参数的解析和绑定,接下来会进行分析springmvc对http请求消息体的解析。将会分析json、xml和mutipart(file)。

http://s5/mw690/004dzziXzy7lhlZMulS34&690
POST请求,contentType为Json,消息体为json数据。

springmvc要解析绑定json数据,必须在handler的接收参数前添加@RequestBody注解,不然没法绑定参数:
首先来看supportsParameter():
http://s2/mw690/004dzziXzy7lnolQ8c901&690
supportsParameter()方法比较简单,只支持添加了@RequestBody注解的参数。

再来看resolveArgument()方法:
来看看this.messageConverters是如何初始化的:
在RequestMappingHandlerAdapter里进行初始化:
http://s14/mw690/004dzziXzy7lnoS5ZkV7d&690
所以,如果不手动对MessageConverters进行配置,默认是可以支持String类型的参数转换的:
http://s11/mw690/004dzziXzy7lnoYCltw4a&690
这里接收到的就是json格式字符串。
要想在参数接收的地方将json直接转换成map或者实体类,则需要手动配置其他的MessageConverters,常用的是MappingJackson2HttpMessageConverter。
springmvc虽然提供了MappingJackson2HttpMessageConverter,但具体使用还需要引入第三方jar包:
http://s2/mw690/004dzziXzy7lnpbnNvz81&690
这三个jar必须都引入,不然会出现异常。
在springmvc.xml里进行配置:
http://s5/mw690/004dzziXzy7lnpgmcEk64&690
这样,handler的参数类型为map和实体类时,都可以正常对json格式的数据进行解析:
http://s8/mw690/004dzziXzy7lnpldpIP47&690
MessageConverters可以配置多个,来简单看下:
http://s12/mw690/004dzziXzy7lnprWAD90b&690
MessageConverters都是实现了这个接口。
http://s9/mw690/004dzziXzy7lnpvYoT6e8&690
canRead()方法判断当前MessageConverter是否可以对参数进行转换。http://s14/mw690/004dzziXzy7lnpAkJ5zcd&690
read()方法从http消息体里读取数据,转换成具体类型的参数。

StringHttpMessageConverter:
http://s10/mw690/004dzziXzy7lnpJbYBXb9&690
http://s12/mw690/004dzziXzy7lnpIYxmzfb&690
StringHttpMessageConverter可以支持参数类型为String的。

MappingJackson2HttpMessageConverter:
http://s5/mw690/004dzziXzy7lnpVR4UYe4&690
http://s1/mw690/004dzziXzy7lnpVPZe070&690
http://s7/mw690/004dzziXzy7lnpVIPtA46&690
MappingJackson2HttpMessageConverter可以解析http请求contentType为json的,至于handler的参数类型,则没有限制。
PS:这里应该是存在一个BUG,MappingJackson2HttpMessageConverter并不能转换任意类型的参数,比如如果参数类型为String,解析是会失败的。所以如果需要String类型也可以解析,则需要在springmvc.xml里同时配置StringHttpMessageConverter和MappingJackson2HttpMessageConverter,并且StringHttpMessageConverter要在MappingJackson2HttpMessageConverter前面,先判断StringHttpMessageConverter是否可以转换,如果不可以,再使用MappingJackson2HttpMessageConverter转换。
springmvc接收json类型的数据的大致流程就分析完了,主要是通过MessageConverter进行解析转换。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有