当前位置: 首页 > article >正文

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 对象
                ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

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

http://www.lryc.cn/news/2386504.html

相关文章:

  • (初级)前端初学者入门指南:HTML5与CSS3核心知识详解
  • 基于点标注的弱监督目标检测方法研究
  • 【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色
  • 超越OpenAI CodeX的软件工程智能体:Jules
  • Qt实战教程:设计并实现一个结构清晰、功能完整的桌面应用
  • 轻量化MEC终端 特点
  • NIST提出新型安全指标:识别潜在被利用漏洞
  • List介绍
  • 正则表达式全解:一文学会正则表达式【附在线正则表达式练习网站】
  • Nginx-详解(二)
  • 解决 IntelliJ IDEA 配置文件中文被转义问题
  • MCP、MCPHub、A2A、AG-UI概述
  • 计算机视觉与深度学习 | Python实现CEEMDAN-ISOS-VMD-GRU-ARIMA时间序列预测(完整源码和数据)
  • [Linux]磁盘分区及swap交换空间
  • JAVA面向对象——对象和类的基本语法
  • Linux常见指令合集+知识点
  • nginx 基于IP和用户的访问
  • 【Linux】系统程序−进度条
  • Axure应用交互设计:动态面板嵌套实现超强体验感菜单表头
  • Linux(6)——第一个小程序(进度条)
  • CentOS:搭建国内软件repository,以实现自动yum网络安装
  • [Git] 认识 Git 的三大区域 文件的修改和提交
  • RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头)
  • 【520 特辑】用 HTML/CSS/JavaScript 打造浪漫炫酷的表白网页
  • 小米2025年校招笔试真题手撕(二)
  • 弱网服务器群到底有什么用
  • 部署Gitlab-CE with Docker私有云环境
  • 拉普拉斯高斯(LoG)滤波器掩模的注意事项
  • 铠大师:让用户畅享多元应用,助力鸿蒙生态发展
  • RocketMQ核心特性与最佳实践