深入浅出:Spring Boot 自定义消息转换器的实现与应用

Spring Boot 作为当前最流行的 Java Web 开发框架之一,广泛应用于微服务架构、企业级应用等多个场景。Spring Boot 提供了灵活且易于扩展的架构,其中消息转换器(Message Converter)是其重要组成部分。消息转换器在 Spring Boot 中负责将 HTTP 请求体中的数据转换为 Java 对象,或将 Java 对象转换为 HTTP 响应体中的数据。

Spring Boot 默认提供了多种消息转换器,如 Jackson 用于 JSON 格式转换、JAXB 用于 XML 格式转换等。然而,实际开发中往往需要根据业务需求进行自定义的消息转换器。自定义消息转换器不仅可以满足特定格式的数据处理需求,还能提升系统的灵活性和可扩展性。

本文将详细介绍如何在 Spring Boot 中实现自定义消息转换器,探讨其工作原理、配置方式以及实际应用场景。通过这篇文章,读者将能清晰理解如何在 Spring Boot 项目中灵活使用消息转换器来实现数据的转换。

一、消息转换器的工作原理

Spring Boot 中的消息转换器(HttpMessageConverter)用于将 HTTP 请求和响应的内容转换为 Java 对象,或将 Java 对象转换为 HTTP 请求和响应的内容。它是通过 RestController@RequestBody@ResponseBody 等注解进行自动绑定的。

1.1 消息转换器的基础概念

消息转换器接口 HttpMessageConverter 负责将 HTTP 请求体的数据转换成 Java 对象,或将 Java 对象转换成 HTTP 响应体的数据。常见的消息转换器包括:

  • MappingJackson2HttpMessageConverter:用于将 JSON 数据与 Java 对象相互转换。
  • Jaxb2RootElementHttpMessageConverter:用于将 XML 数据与 Java 对象相互转换。
  • StringHttpMessageConverter:用于处理文本数据,如 text/plain

在 Spring Boot 中,HttpMessageConverter 主要依赖于 @RequestBody@ResponseBody 来自动绑定请求体与 Java 对象,或者将响应数据转换为指定的格式。

1.2 HttpMessageConverter 接口

HttpMessageConverter 是 Spring 中进行消息转换的核心接口,其定义了以下主要方法:

  • boolean canRead(Class<?> clazz, MediaType mediaType):判断当前消息转换器是否能够将指定的媒体类型转换为目标类型。
  • boolean canWrite(Class<?> clazz, MediaType mediaType):判断当前消息转换器是否能够将指定的对象转换为指定的媒体类型。
  • List<MediaType> getSupportedMediaTypes():返回当前消息转换器支持的媒体类型。
  • T read(Class<? extends T> clazz, HttpInputMessage inputMessage):将输入消息体转换为 Java 对象。
  • void write(T t, MediaType contentType, HttpOutputMessage outputMessage):将 Java 对象转换为输出消息体。

这些方法提供了自定义消息转换器时必须实现的基本框架。

1.3 HttpMessageConverter 与 Spring Boot 的集成

在 Spring Boot 中,HttpMessageConverter 被自动注册到 HttpMessageConverters 中,Spring Boot 会根据请求头(如 Content-TypeAccept)自动选择合适的消息转换器进行数据转换。例如,当客户端发送 JSON 数据时,Spring 会自动选择 MappingJackson2HttpMessageConverter 进行转换。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MyCustomMessageConverter());}
}

上述代码中,我们可以通过 WebMvcConfigurerextendMessageConverters 方法来添加自定义的消息转换器。

二、如何实现自定义消息转换器

在 Spring Boot 中实现自定义消息转换器并不复杂,基本步骤是继承 AbstractHttpMessageConverter 类,重写必要的方法,并注册到 Spring 的消息转换器列表中。

2.1 自定义消息转换器的基本步骤

  1. 继承 AbstractHttpMessageConverter:创建一个新的类,继承 AbstractHttpMessageConverter 或实现 HttpMessageConverter 接口。
  2. 实现 canReadcanWrite 方法:这两个方法用于判断当前消息转换器是否支持读取和写入指定类型的数据。
  3. 实现 readwrite 方法:分别负责从输入流读取数据并转换成 Java 对象,以及将 Java 对象写入输出流。

2.2 示例:实现一个自定义 JSON 格式的消息转换器

假设我们需要实现一个自定义的 JSON 消息转换器,来处理一些特殊格式的 JSON 数据。我们可以按以下步骤进行实现。

2.2.1 继承 AbstractHttpMessageConverter
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;import java.io.IOException;public class MyCustomJsonMessageConverter extends AbstractHttpMessageConverter<MyCustomObject> {public MyCustomJsonMessageConverter() {super(MediaType.APPLICATION_JSON); // 支持的媒体类型}@Overrideprotected boolean supports(Class<?> clazz) {return MyCustomObject.class.equals(clazz);}@Overrideprotected MyCustomObject readInternal(Class<? extends MyCustomObject> clazz,HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {// 从输入流中读取数据并转换为自定义对象String json = new String(inputMessage.getBody().readAllBytes());return new MyCustomObject(json);}@Overrideprotected void writeInternal(MyCustomObject myCustomObject, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {// 将自定义对象转换为 JSON 数据并写入输出流String json = myCustomObject.toJson();outputMessage.getBody().write(json.getBytes());}
}

在这个例子中,我们创建了一个 MyCustomJsonMessageConverter 类,它继承自 AbstractHttpMessageConverter。我们重写了 supports 方法来判断该转换器是否支持 MyCustomObject 类型,readInternal 方法来从输入流读取 JSON 数据并转换为 MyCustomObject,以及 writeInternal 方法将 MyCustomObject 转换为 JSON 格式并写入输出流。

2.2.2 注册自定义消息转换器

接下来,我们需要将自定义的消息转换器注册到 Spring Boot 中。可以通过实现 WebMvcConfigurer 接口并覆盖 extendMessageConverters 方法来实现。

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MyCustomJsonMessageConverter()); // 注册自定义消息转换器}
}

WebConfig 配置类中,我们通过 extendMessageConverters 方法将 MyCustomJsonMessageConverter 注册到 Spring Boot 的消息转换器列表中。这样,当 Spring Boot 遇到 MyCustomObject 类型的请求时,就会使用我们自定义的转换器。

三、实际应用场景

3.1 处理特殊数据格式

自定义消息转换器常常用于处理一些特殊的数据格式,如自定义的 JSON、XML 格式,或第三方服务返回的数据格式。例如,某些 API 返回的数据不完全符合标准的 JSON 格式,或者需要对请求或响应的数据进行加密解密处理。这时,通过自定义消息转换器,我们可以在数据转换的过程中进行特殊处理。

3.2 提升系统灵活性与可扩展性

自定义消息转换器可以使得系统具备更高的灵活性和可扩展性。例如,系统中可能有多个不同的数据源,每个数据源返回的格式不同。通过自定义消息转换器,我们可以灵活地扩展支持不同格式的消息处理,而无需修改现有的业务逻辑代码。

3.3 实现统一的格式化输出

在实际开发中,有时需要将不同的数据源统一成一种输出格式。通过自定义消息转换器,可以将各种不同的数据格式统一转化为 JSON 或 XML 格式,并进行统一处理。例如,数据输出时可以统一添加时间戳、状态码等元信息,确保输出格式一致。

四、总结

Spring Boot 提供了强大的消息转换器机制,允许开发者根据业务需求灵活地对请求和响应数据进行格式转换。自定义消息转换器不仅可以帮助我们处理特殊格式的数据,还能提升系统的灵活性和可扩展性。

通过本文的讲解,我们了解了如何实现自定义消息转换器的基本步骤,包括继承 `AbstractHttpMessage

Converter` 类,重写核心方法,注册到 Spring Boot 的消息转换器列表中,并在实际开发中应用。希望通过这些示例和分析,能帮助开发者在实际项目中更加高效地使用 Spring Boot 的消息转换器来处理各种复杂的数据格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501017.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现自动登录12306抢票 -- selenium

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码&#xff0c;但是都不是最新的&#xff0c;我也是从网上找别人的帖子&#xff0c;看B站视频&…

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型 目录 机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型1 过拟合和欠拟合1.1 过拟合1.2 欠拟合 2 正则化惩罚2.1 概念2.2 函数2.3 正则化种类 3 K折交叉验证3.1 概念3.2 图片理解3.3 函数导入3.4 参数理解 4 训练模型K折交…

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…

《Vue3实战教程》37:Vue3生产部署

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 生产部署​ 开发环境 vs. 生产环境​ 在开发过程中&#xff0c;Vue 提供了许多功能来提升开发体验&#xff1a; 对常见错误和隐患的警告对组件 props / 自定义事件的校验响应性调试钩子开发工具集成 然而&#xff…

python制作打字小游戏

import pygame # 导入游戏模块 安装pygame import sys # 导入系统指令模块 import random # 导入随机数模块 pygame.init() #初始化游戏环境 wndpygame.display.set_mode((800,565)) #指定窗口大小 pygame.mixer.music.load(素材/SurvivalGame.mp3) #素…

抖音短视频矩阵系统源码开发全流程解析

在项目开发过程中&#xff0c;调整配置文件至关重要&#xff0c;这些文件包括数据库连接、API密钥及全局参数等。通过正确配置这些信息&#xff0c;可确保应用程序的稳定性和安全性。灵活调整配置以适应具体需求有助于短视频矩阵系统项目的顺利推进。 在开发环境中&#xff0c…

前端路由layout布局处理以及菜单交互(三)

上篇介绍了前端项目部署以及基本依赖的应用&#xff0c;这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举

本篇博客将聚焦于通过递归来实现两种经典的枚举方法&#xff1a;指数型枚举和排列型枚举。这两种枚举方式在计算机科学和算法竞赛中都有广泛应用&#xff0c;无论是在解题中&#xff0c;还是在实际工作中都极具价值。 目录 前言 斐波那契数列递归 递归实现指数型枚举 算法思…

idea 的 springboot项目spring-boot-devtools 自动编译 配置热部署

1&#xff0c;设置一 2&#xff0c;设置二 设置二&#xff08;旧版本&#xff09; CtrlShiftAlt/ 点击弹出框中Registry... 引入&#xff08;如果报错&#xff0c;换不同的版本&#xff09; <dependency><groupId>org.springframework.boot</groupId><a…

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…

C#二维数组详解

目录 1&#xff0c;什么是二维数组&#xff1f; 2&#xff0c;创建二维数组的几种方式 &#xff08;1&#xff09;使用[,]声明数组&#xff08;常见方式&#xff09; &#xff08;2&#xff09;声明数组时指定元素 &#xff08;3&#xff09;使用new创建数组 &#xff08;…

STM32--超声波模块(HC—SR04)(标准库+HAL库)

一、HC-SR04工作原理 1&#xff09;采用IO触发测距&#xff0c;给至少10us的高电平信号。 2&#xff09;模块自动发送8个40KHz的方波&#xff0c;自动检测是否有信号返回。 3&#xff09;有信号返回&#xff0c;通过IO输出一高电平&#xff0c;高电平持续时间就是超声波从发…

DDD(一)—— Authentication with JWT

文章目录 项目地址一、项目结构梳理1.1 Domain层1.1.1 Entities文件夹1.2 Contracts层1.2.1 Authentication文件夹1.3 Appliaction层1.3.1Common文件夹1. Interfaces文件夹Authentication 权限接口Persistence 数据库接口Services 常用服务接口1.3.2 Services文件夹1. Authenti…

GPU 进阶笔记(一):高性能 GPU 服务器硬件拓扑与集群组网

记录一些平时接触到的 GPU 知识。由于是笔记而非教程&#xff0c;因此内容不求连贯&#xff0c;有基础的同学可作查漏补缺之用 1 术语与基础 1.1 PCIe 交换芯片1.2 NVLink 定义演进&#xff1a;1/2/3/4 代监控1.3 NVSwitch1.4 NVLink Switch1.5 HBM (High Bandwidth Memory) 由…

自由学习记录(31)

Java连接MySQL 找到那个关键jar包然后导入选中&#xff0c;就配置好MySQL的JDBC&#xff08;Java Database Connectivity&#xff09;了 菜单--文件--项目结构 项目设置--模块--选择要附着的项目--选择依赖--选中模块源--选中加号添加jar包 解压之后在里面可以看到这个最关键…

第十四届蓝桥杯Scratch省赛中级组—智能计价器

智能计价器 背景信息&#xff1a; A城市的出租车计价&#xff1a;3公里以内13元&#xff0c;基本单价每公里2.3元(超过3公里的部分&#xff0c;不满1公里按照1公里收费&#xff09;&#xff0c;燃油附加费每运次1元。 例如&#xff1a; 3.2公里的打车费用&#xff1a;132.3…

游戏引擎学习第69天

回顾碰撞响应时我们停留的位置 从昨天的讨论开始&#xff0c;我们正准备处理碰撞响应的复杂性。具体来说&#xff0c;我们讨论的是&#xff0c;当两个实体在屏幕上发生碰撞时&#xff0c;如何回应这种情况。碰撞本身并不复杂&#xff0c;但要处理其后的反应和规则则更具挑战性…

全新免押租赁系统助力商品流通高效安全

内容概要 全新免押租赁系统的推出&#xff0c;可以说是一场商品流通领域的小革命。想象一下&#xff0c;不再为押金烦恼&#xff0c;用户只需通过一个简单的信用评估&#xff0c;就能快速租到所需商品&#xff0c;这种体验简直令人惊喜&#xff01;这个系统利用代扣支付技术&a…

【Python科研数据爬虫】基于国家标准查询平台和能源标准化信息平台的海上风电相关行业标准查询信息爬取及处理

基于国家标准查询平台和能源标准化信息平台的海上风电相关行业标准查询信息爬取及处理 1 背景2 标准检索平台2.1 能源标准化信息平台2.2 全国标准信息公共服务平台3 标准信息数据的爬取与处理3.1 能源标准化信息平台的信息爬取3.2 全国标准信息公共服务平台的信息爬取3.3 标准信…