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指定

相关推荐
泡泡以安9 分钟前
【Android逆向工程】第3章:Java 字节码与 Smali 语法基础
android·java·安卓逆向
毕设源码-朱学姐6 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
Spring AI学习7 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
unique_perfect8 小时前
vue2与springboot实现deepseek打印机聊天
spring boot·websocket·ai·vue2·deepseek
java1234_小锋8 小时前
Spring IoC的实现机制是什么?
java·后端·spring
xqqxqxxq8 小时前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
消失的旧时光-19439 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊9 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
4311媒体网9 小时前
帝国cms调用文章内容 二开基本操作
java·开发语言·php