@RequestBody注解原理

 我来答
舒适还明净的海鸥i
2022-06-19 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:70.6万
展开全部

从源码中可以看到,@RequestBody 用在方法参数上面,用来将请求参数绑定到request body中,通过 HttpMessageConverter 封装为具体的JavaBean。通俗点讲就是你在一个参数上加上该注解,spring就会将request body中的json/xml对象解析成该参数类型的Javabean对象。
作为RESTful开发中经常用到的注解,研究其原理有利于我们更好地理解并掌握它。
那么spring是如何做到这一点的呢?先来看DispatcherServlet。
作为springMVC处理请求的中央调度器,DispatcherServlet本身是一个servlet,所以我们看doService():

重点在doDispatch()方法,该方法先找到会找到合适的handler来处理当前请求:

HandlerAdapter是一个接口,具体处理方法在 RequestMappingHandlerAdapter 类中:

这里又调用了handleInternal()方法,RequestMappingHandlerAdapter重写了该方法:
进入该方法,

可以看到最终调用的都是invokeHandlerMethod()方法,此方法会处理@RequestMapping修饰的请求

进入该方法的 invocableMethod.invokeAndHandle(webRequest, mavContainer); ,来到ServletInvocableHandlerMethod,此类继承了InvocableHandlerMethod,可以处理请求的返回值。invokeAndHandle()方法:

重点在 Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs); ,通过请求调用并产生返回值。

getMethodArgumentValues() 方法的作用是获取方法参数,重点就在这里,

进入resolveArgument()方法,

@RequestBody修饰的参数会使用RequestResponseBodyMethodProcessor解析,

进入readWithMessageConverters()方法一路顺藤摸瓜,来到AbstractMessageConverterMethodArgumentResolver的readWithMessageConverters(),

可以看到使用文章开头提到的HttpMessageConverter解析参数并返回,而此处的HttpMessageConverter是在RequestMappingHandlerAdapter中设置解析器的时候添加到每个解析器中的。而json格式的数据使用AbstractJackson2HttpMessageConverter进行解析,内部使用jackson进行json数据的解析。

请求由DispatcherServlet处理,找到相应的HandlerAdapter进行处理,RequestMappingHandlerAdapter会处理@RequestMapping注解的请求,设置一系列参数解析器进行解析,如果参数使用@RequestBody注解,则使用RequestResponseBodyMethodProcessor进行解析,此参数解析器用HttpMessageConverter将HttpMessage封装为具体的JavaBean对象,json格式的数据使用AbstractJackson2HttpMessageConverter进行解析,内部使用jackson进行json数据的解析。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式