SpringBoot中消息转换器的选择

SpringBoot返回xml-CSDN博客

是返回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 对象

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

✅ 此时是 **请求消息转换器触发时机(反序列化)**

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

  1. 调用 Controller 方法,拿到返回值(比如 User)

  2. 响应返回阶段:

→ 根据返回值类型 & 客户端 Accept 头

→ 找合适的 HttpMessageConverter

→ 调用 converter.write() 把 Java 对象 → JSON

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

✅ 此时是 **响应消息转换器触发时机(序列化)**

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

  1. 最终将 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指定

相关推荐
花哥码天下35 分钟前
apifox登录后设置token到环境变量
java·后端
浩瀚地学1 小时前
【Java】常用API(二)
java·开发语言·经验分享·笔记·学习
廋到被风吹走1 小时前
【Spring】Spring MVC核心原理与RESTful最佳实践详解
spring·mvc·restful
hashiqimiya2 小时前
springboot事务触发滚动与不滚蛋
java·spring boot·后端
因我你好久不见2 小时前
Windows部署springboot jar支持开机自启动
windows·spring boot·jar
PPPHUANG2 小时前
一次 CompletableFuture 误用,如何耗尽 IO 线程池并拖垮整个系统
java·后端·代码规范
恩创软件开发2 小时前
创业日常2026-1-8
java·经验分享·微信小程序·小程序
无关86883 小时前
SpringBootApplication注解大解密
spring boot