springmvc的RequestResponseBodyMethodProcessor解析

标签:
itjavaspringspringmvc |
分类: spring技术 |
前面分析了springmvc对一些基本的请求参数的解析和绑定,接下来会进行分析springmvc对http请求消息体的解析。将会分析json、xml和mutipart(file)。
springmvc要解析绑定json数据,必须在handler的接收参数前添加@RequestBody注解,不然没法绑定参数:
首先来看supportsParameter():
再来看resolveArgument()方法:
http://s4/mw690/004dzziXzy7lnoFuGWLc3&690
http://s10/mw690/004dzziXzy7lnoFRjFn79&690
http://s4/mw690/004dzziXzy7lnoFG9bB73&690
可以看出,参数的具体解析是通过MessageConverters进行的。
http://s10/mw690/004dzziXzy7lnoFRjFn79&690
http://s4/mw690/004dzziXzy7lnoFG9bB73&690
可以看出,参数的具体解析是通过MessageConverters进行的。
来看看this.messageConverters是如何初始化的:
在RequestMappingHandlerAdapter里进行初始化:
要想在参数接收的地方将json直接转换成map或者实体类,则需要手动配置其他的MessageConverters,常用的是MappingJackson2HttpMessageConverter。
springmvc虽然提供了MappingJackson2HttpMessageConverter,但具体使用还需要引入第三方jar包:
在springmvc.xml里进行配置:
http://s9/mw690/004dzziXzy7lnpvYoT6e8&690
canRead()方法判断当前MessageConverter是否可以对参数进行转换。http://s14/mw690/004dzziXzy7lnpAkJ5zcd&690
canRead()方法判断当前MessageConverter是否可以对参数进行转换。http://s14/mw690/004dzziXzy7lnpAkJ5zcd&690
read()方法从http消息体里读取数据,转换成具体类型的参数。
StringHttpMessageConverter:
http://s10/mw690/004dzziXzy7lnpJbYBXb9&690
http://s12/mw690/004dzziXzy7lnpIYxmzfb&690
StringHttpMessageConverter可以支持参数类型为String的。
http://s12/mw690/004dzziXzy7lnpIYxmzfb&690
StringHttpMessageConvert
MappingJackson2HttpMessageConverter:
http://s5/mw690/004dzziXzy7lnpVR4UYe4&690
http://s1/mw690/004dzziXzy7lnpVPZe070&690
http://s7/mw690/004dzziXzy7lnpVIPtA46&690
MappingJackson2HttpMessageConverter可以解析http请求contentType为json的,至于handler的参数类型,则没有限制。
http://s1/mw690/004dzziXzy7lnpVPZe070&690
http://s7/mw690/004dzziXzy7lnpVIPtA46&690
MappingJackson2HttpMessa
PS:这里应该是存在一个BUG,MappingJackson2HttpMessageConverter并不能转换任意类型的参数,比如如果参数类型为String,解析是会失败的。所以如果需要String类型也可以解析,则需要在springmvc.xml里同时配置StringHttpMessageConverter和MappingJackson2HttpMessageConverter,并且StringHttpMessageConverter要在MappingJackson2HttpMessageConverter前面,先判断StringHttpMessageConverter是否可以转换,如果不可以,再使用MappingJackson2HttpMessageConverter转换。
springmvc接收json类型的数据的大致流程就分析完了,主要是通过MessageConverter进行解析转换。