SpringBoot(响应处理)返回值解析器原理--源码分析

举例:发送get请求返回json数据(给前端自动返回json数据)

http://localhost:8889/test/person

前置条件

jackson.jar+@ResponseBody

在pom.xml 文件中加入

     
web场景自动引入了json场景
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.3.4.RELEASE</version>
      <scope>compile</scope>
    </dependency>
 

Controller 
@ResponseBody
@GetMapping(value = "/test/person")
public Person getPerson(){
    Person person = new Person();
    person.setAge(28);
    person.setBirth(new Date());
    person.setUserName("zhangsan");
    return person;
}

执行结果

返回值解析器原理

入口:SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet-》doDispatch()

返回值解析器

 15个返回值解析器

获取返回值类型

寻找返回值处理器来处理返回值

返回值处理器判断是否支持这种类型返回值 supportsReturnType

RequestResponseBodyMethodProcessor处理器 可以处理返回值标了@ResponseBody 注解的。

返回值处理器调用 handleReturnValue 进行处理

找到对应返回值处理器

利用 MessageConverters 进行处理 将数据写为json

HTTPMessageConverter原理

内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)

获取客户端(PostMan、浏览器)支持接收的内容类型。(获取客户端Accept请求头字段)【application/xml】

    • contentNegotiationManager 内容协商管理器 默认使用基于请求头的策略

 

服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,

客户端需要【application/xml】。服务端能力【10种、json、xml】 

进行内容协商的最佳匹配媒体类型

遍历循环所有当前系统的 MessageConverter,看谁支持操作这个对象(Person)

1.MessageConverter规范

HttpMessageConverter: 看是否支持将 此 Class类型的对象,转为MediaType类型的数据。

例子:Person对象转为JSON。或者 JSON转为Person

2.默认的MessageConverter

0 - 只支持Byte类型的

1 - String

2 - String

3 - Resource

4 - ResourceRegion

5 - DOMSource.class \ SAXSource.class) \ StAXSource.class \StreamSource.class \Source.class

6 - MultiValueMap

7 - true

8 - true

9 - 支持注解方式xml处理的。 

  • 1、得到MappingJackson2HttpMessageConverter可以将对象写为json
  • 2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

最终 MappingJackson2HttpMessageConverter 把对象转为JSON(利用底层的jackson的objectMapper转换的)

处理派发结果,把json数据返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值