@RequestBody注解原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@RequestBody注解原理相关的知识,希望对你有一定的参考价值。
参考技术A 从源码中可以看到,@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数据的解析。
以上是关于@RequestBody注解原理的主要内容,如果未能解决你的问题,请参考以下文章
关于Spring @RequestBody 自动映射模型原理