内容协商原理-HttpMessageConverter
学习逻辑链:
- 目的:想要自定义接口的返回内容
- 分析:要想自定义接口的返回内容,就要先理解内容协商的底层原理;而要理解内容协商的底层原理,只要知道
HttpMessageConverter
怎么工作,什么时候工作就行了;知道HttpMessageConverter
工作原理后,就能通过定制HttpMessageConverter
来实现多端内容协商,以达到自定义接口返回内容的目的。- 步骤:
a. 了解HttpMessageConverter
怎么工作,什么时候工作。
b. 这样就能,理解内容协商的底层原理。
c. 接下来就能,通过定制HttpMessageConverter
来实现多端内容协商。
d. 这样就,达到了想要自定义接口的返回内容的目的。- 总结:要想知道怎么自定义接口的返回内容,其实就是要知道怎么通过定制
HttpMessageConverter
来实现多端内容协商。
在WebMvcConfigurer
接口里,能够配置很多底层的东西,其中就包含了一个configureMessageConverters
,如下图。
只需要编写WebMvcConfigurer
接口提供的configureMessageConverters
底层,修改底层的MessageConverters
就可以了。
思考:只要修改以上的MessageConverters
就可以了,但为什么这样做就可以了?这就是接下来要说的内容了。
@ResponseBody由HttpMessageConverter处理
在向浏览器返回内容的controller里,有一个
@RestController
注解,而这个注解里又包含一个@ResponseBody
,而注解标注在类上面,就表示标注在每一个方法上。
如果controller方法的返回值标注了@ResponseBody
注解
- 按照
SpringMVC
的原理,我们从DispatcherServlet.class
开始,所有请求来到DispatcherServlet
,都是从doDispatch()
开始的。 - ctlr+n搜索
DispatcherServlet.class
,进入后继续ctlr+n搜索doDispatch()
,在其内容第一行设置一个断点,找到以下界面:
- 往下翻找到
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
。
- 如果根据/person这个请求路径找到了某个方法要处理,那就要找到这个适配器,最终利用这个适配器处理方法。往下翻找到
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
,如图。这是正真执行handler
的语句。
- 给person()第一行打个断点,并以debug启动,看看是怎么处理的。
- 浏览器访问
http://localhost:8080/person?format=json
,先来到doDispatch
,它来接第一个请求。
放行。
再放行,来到正真执行handler
的语句的位置。
- 这个时候点击
step into
,进到这个目标执行方法,来到以下界面:
再点进handleInternal
,往下翻,看到invokeHandlerMethod
方法。
点进去,在第一行设置一个断点:
一直放行到这,目标方法还没进行到,只进行到invokeHandlerMethod
,所以得到以下结论:
a. 请求进来先来到DispatcherServlet的doDispatch()
进行处理
b. 找到一个HandlerAdapter
适配器,利用适配器执行目标方法
c.RequestMappingHandlerAdapter
来执行,调用invokeHandlerMethod()
来执行目标方法。
未完