举例:发送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数据返回