是返回JSON 还是XML
是由内容协商机制确认的,SpringBoot为了开发便利性,如果我没有该消息转换器,默认就返回了JSON,如果需要XML那么,引入
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
SpringBoot关于内容协商有两种方式
第一种就是浏览器请求头带过来的Accept
第二种是format方式(需要配置)
下面对消息转换器的了解描述
HttpMessageConverter接口
HttpMessageConverter接口被称为Htpp消息转换器
当我们引入spring-boot-starter-web时候时候默认的消息转换器是
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
而当我们引入
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
之后
消息转换器的实现变成了
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter
注意:消息转换器的实现既有用于消息(参数接收),也有用于响应格式
例如
接收
@PostMapping("/user")
public String save(@RequestBody User user) {
// JSON 请求体会被转换成 User 实例
...
}
响应
@GetMapping("/user")
public User getUser() {
return new User("Tom", 20);
}
整体流程
↓ HTTP Request
[Content-Type: application/json]↓ 请求体
{"name": "Tom", "age": 20}↓
[HttpMessageConverter (read)]
↓
Java对象 User----------------------------------
Java对象 User
↓
[HttpMessageConverter (write)]
↓
{"name": "Tom", "age": 20}↓ HTTP Response
[Content-Type: application/json]
执行的时机(注意:GET 请求中像 xxx?name=xxx&age=xxx
这种参数,不需要用消息转换器,Spring 会直接用参数解析器处理,不走 HttpMessageConverter
)
也就是说只有请求体中的会被消息转换器转换 form表单(特殊)和@RequestBody
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
【客户端发请求】
POST /user
Content-Type: application/json
Body: {"name":"Tom","age":20}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓1. DispatcherServlet 接收到请求
2. RequestMappingHandlerAdapter 开始处理请求
3. 参数解析阶段:
如果有 @RequestBody User user
→ 找合适的 HttpMessageConverter
→ 调用 converter.read() 把 JSON → Java 对象
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓✅ 此时是 **请求消息转换器触发时机(反序列化)**
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
4. 调用 Controller 方法,拿到返回值(比如 User)
5. 响应返回阶段:
→ 根据返回值类型 & 客户端 Accept 头
→ 找合适的 HttpMessageConverter
→ 调用 converter.write() 把 Java 对象 → JSON↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
✅ 此时是 **响应消息转换器触发时机(序列化)**
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
6. 最终将 JSON 返回到浏览器或客户端
我们可以看下,因为原先有demo 就不重建项目了
是否使用消息转换器
请求时
响应时
系统默认的消息转换器
可以在方法末尾打断点 看下 messageConverters里有几个消息转换器
框起来的应该是直接加进去的
默认的几个消息转换器的作用
自定义消息转换器
例如:需要是,现在我不想返回JSON,不想返回xml,需要返回yaml格式数据
第一步:引入依赖
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency>
---在yaml中就是一个分割 分割后是单独一个文档意思
第二步:新增一种媒体类型yaml
什么是媒体类型
在配置文件中新增一种媒体
第三步:写自定义消息转换器
自定义消息转换器需要实现HttpMesageConverter接口 或者继承AbstractHttpMessageConverter抽象类
实现三个方法的说明
绑定配置文件中配置的媒体类型
第四步:将自定义消息转换器添加到Boot中(配置消息转换器)
测试
也可以用format指定