本文主要是介绍springmvc的RequestResponseBodyMethodProcessor解析_晏无心_新浪博客,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前面分析了springmvc对一些基本的请求参数的解析和绑定,接下来会进行分析springmvc对http请求消息体的解析。将会分析json、xml和mutipart(file)。
POST请求,contentType为Json,消息体为json数据。
supportsParameter()方法比较简单,只支持添加了@RequestBody注解的参数。
可以看出,参数的具体解析是通过MessageConverters进行的。
所以,如果不手动对MessageConverters进行配置,默认是可以支持String类型的参数转换的:
这里接收到的就是json格式字符串。
这三个jar必须都引入,不然会出现异常。
这样,handler的参数类型为map和实体类时,都可以正常对json格式的数据进行解析:
MessageConverters可以配置多个,来简单看下:
MessageConverters都是实现了这个接口。
canRead()方法判断当前MessageConverter是否可以对参数进行转换。
StringHttpMessageConverter可以支持参数类型为String的。
MappingJackson2HttpMessageConverter可以解析http请求contentType为json的,至于handler的参数类型,则没有限制。
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/e6a05e30898c417d91c4fe325d394359.jpeg)
POST请求,contentType为Json,消息体为json数据。
springmvc要解析绑定json数据,必须在handler的接收参数前添加@RequestBody注解,不然没法绑定参数:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/f0c6ce26bfeee51202b7f8bd6a281d1e.jpeg)
首先来看supportsParameter():
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/d67f28af4d12e4632f6b0c3ccb7df3c6.jpeg)
supportsParameter()方法比较简单,只支持添加了@RequestBody注解的参数。
再来看resolveArgument()方法:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/59c23e57eb1abd304b9649210d135f8b.jpeg)
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/c0a5b643f0817b04eea089eb8a8ec159.jpeg)
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/f7a458fe6b6e78927cccf35f1a4be443.jpeg)
可以看出,参数的具体解析是通过MessageConverters进行的。
来看看this.messageConverters是如何初始化的:
在RequestMappingHandlerAdapter里进行初始化:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/da6b65165cbe1610c887a1789ae62130.jpeg)
所以,如果不手动对MessageConverters进行配置,默认是可以支持String类型的参数转换的:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/6b48a9fdd44617d88d9fac5c7646b97c.jpeg)
这里接收到的就是json格式字符串。
要想在参数接收的地方将json直接转换成map或者实体类,则需要手动配置其他的MessageConverters,常用的是MappingJackson2HttpMessageConverter。
springmvc虽然提供了MappingJackson2HttpMessageConverter,但具体使用还需要引入第三方jar包:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/125cfe983d0263fb28989391681e970c.jpeg)
这三个jar必须都引入,不然会出现异常。
在springmvc.xml里进行配置:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/4b5e054203bc265b767def62732ad5b1.jpeg)
这样,handler的参数类型为map和实体类时,都可以正常对json格式的数据进行解析:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/46a80e52f2df304de3409d05c965d367.jpeg)
MessageConverters可以配置多个,来简单看下:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/fade905e0b869fd7023194cfffcedd97.jpeg)
MessageConverters都是实现了这个接口。
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/209e5326218130c2def5b1c957c4de33.jpeg)
canRead()方法判断当前MessageConverter是否可以对参数进行转换。
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/5849ceec3c2b3dd60d7465b2914fcb0c.jpeg)
read()方法从http消息体里读取数据,转换成具体类型的参数。
StringHttpMessageConverter:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/11f1ad5b03e3a9c9dfb0661938c64ad5.jpeg)
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/85296ea4d59ec8899ee4e7a4d8efb855.jpeg)
StringHttpMessageConverter可以支持参数类型为String的。
MappingJackson2HttpMessageConverter:
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/400ec5398d92e0610d5415d7d85a675b.jpeg)
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/c10d8de68733fa5d0a5db80be8d338ce.jpeg)
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/1dd14f781b5026466e011869765348a7.jpeg)
MappingJackson2HttpMessageConverter可以解析http请求contentType为json的,至于handler的参数类型,则没有限制。
PS:这里应该是存在一个BUG,MappingJackson2HttpMessageConverter并不能转换任意类型的参数,比如如果参数类型为String,解析是会失败的。所以如果需要String类型也可以解析,则需要在springmvc.xml里同时配置StringHttpMessageConverter和MappingJackson2HttpMessageConverter,并且StringHttpMessageConverter要在MappingJackson2HttpMessageConverter前面,先判断StringHttpMessageConverter是否可以转换,如果不可以,再使用MappingJackson2HttpMessageConverter转换。
![springmvc的RequestResponseBodyMethodProcessor解析 springmvc的RequestResponseBodyMethodProcessor解析](https://i-blog.csdnimg.cn/blog_migrate/c34dfe4518423e277aa559e694fd38f3.jpeg)
springmvc接收json类型的数据的大致流程就分析完了,主要是通过MessageConverter进行解析转换。
这篇关于springmvc的RequestResponseBodyMethodProcessor解析_晏无心_新浪博客的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!