SpringBoot-Web开发-08-内容协商原理-HttpMessageConverter(上)

发布于:2025-09-09 ⋅ 阅读:(23) ⋅ 点赞:(0)

上一篇:SpringBoot-Web开发-07-内容协商——多端内容适配

内容协商原理-HttpMessageConverter

学习逻辑链:

  1. 目的:想要自定义接口的返回内容
  2. 分析:要想自定义接口的返回内容,就要先理解内容协商的底层原理;而要理解内容协商的底层原理,只要知道HttpMessageConverter怎么工作,什么时候工作就行了;知道HttpMessageConverter工作原理后,就能通过定制HttpMessageConverter来实现多端内容协商,以达到自定义接口返回内容的目的。
  3. 步骤:
    a. 了解HttpMessageConverter怎么工作,什么时候工作。
    b. 这样就能,理解内容协商的底层原理
    c. 接下来就能,通过定制HttpMessageConverter来实现多端内容协商。
    d. 这样就,达到了想要自定义接口的返回内容的目的。
  4. 总结:要想知道怎么自定义接口的返回内容,其实就是要知道怎么通过定制HttpMessageConverter来实现多端内容协商。

WebMvcConfigurer接口里,能够配置很多底层的东西,其中就包含了一个configureMessageConverters,如下图。
在这里插入图片描述
只需要编写WebMvcConfigurer接口提供的configureMessageConverters底层,修改底层的MessageConverters就可以了。
思考:只要修改以上的MessageConverters就可以了,但为什么这样做就可以了?这就是接下来要说的内容了。

@ResponseBody由HttpMessageConverter处理

在向浏览器返回内容的controller里,有一个@RestController注解,而这个注解里又包含一个@ResponseBody,而注解标注在类上面,就表示标注在每一个方法上。

如果controller方法的返回值标注了@ResponseBody注解
  1. 按照SpringMVC的原理,我们从DispatcherServlet.class开始,所有请求来到DispatcherServlet,都是从doDispatch()开始的。
  2. ctlr+n搜索DispatcherServlet.class,进入后继续ctlr+n搜索doDispatch(),在其内容第一行设置一个断点,找到以下界面:
    在这里插入图片描述
  3. 往下翻找到HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
    在这里插入图片描述
  4. 如果根据/person这个请求路径找到了某个方法要处理,那就要找到这个适配器,最终利用这个适配器处理方法。往下翻找到mv = ha.handle(processedRequest, response, mappedHandler.getHandler());,如图。这是正真执行handler的语句。
    在这里插入图片描述
  5. 给person()第一行打个断点,并以debug启动,看看是怎么处理的。
    在这里插入图片描述
  6. 浏览器访问http://localhost:8080/person?format=json,先来到doDispatch,它来接第一个请求。在这里插入图片描述
    放行。
    在这里插入图片描述
    再放行,来到正真执行handler的语句的位置。
    在这里插入图片描述
  7. 这个时候点击step into,进到这个目标执行方法,来到以下界面:
    在这里插入图片描述
    再点进handleInternal,往下翻,看到invokeHandlerMethod方法。
    在这里插入图片描述
    点进去,在第一行设置一个断点:
    在这里插入图片描述
    一直放行到这,目标方法还没进行到,只进行到invokeHandlerMethod,所以得到以下结论:
    a. 请求进来先来到DispatcherServlet的doDispatch()进行处理
    b. 找到一个HandlerAdapter适配器,利用适配器执行目标方法
    c. RequestMappingHandlerAdapter来执行,调用invokeHandlerMethod()来执行目标方法。

未完

上一篇:SpringBoot-Web开发-07-内容协商——多端内容适配


网站公告

今日签到

点亮在社区的每一天
去签到