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

苍穹外卖之SpringMVC的消息转换器在项目中的应用场景

SpringMVC的消息转换器

参考视频或文章

  • https://blog.csdn.net/m0_50742275/article/details/144899648?fromshare=blogdetail&sharetype=blogdetail&sharerId=144899648&sharerefer=PC&sharesource=2401_83600210&sharefrom=from_link

一、技术介绍

1.概述

  • SpringMVC的消息转换器(Message Converter)是Spring框架中用于处理HTTP请求体或响应体与Java对象之间转换的组件。
  • 让开发人员可以轻松地将HTTP请求的数据映射到方法参数,并将返回的对象转换为HTTP响应。

2.工作原理

当一个HTTP请求到达SpringMVC应用程序时,Spring框架会根据该请求的Content-Type(内容类型)和Accept(接受类型)来选择合适的消息转换器。

例如:客户端发送了一个JSON格式的POST请求,那么SpringMVC会选择MappingJackson2HttpMessageConverter这一消息转换器来将请求体反序列化为Java对象;当方法返回一个Java对象并需要将其发送给客户端时,SpringMVC仍会使用这一消息转换器来将这个Java对象序列化为JSON格式的响应体。

3.常见的内置消息转换器

消息转换器功能依赖/适用场景
MappingJackson2HttpMessageConverter支持JSON格式的HTTP消息序列化与反序列化依赖Jackson库
MappingJackson2XmlHttpMessageConverter支持XML格式的HTTP消息序列化与反序列化依赖Jackson库
StringHttpMessageConverter处理纯文本字符串类型的HTTP消息无特殊依赖,适用于文本传输场景
FormHttpMessageConverter处理表单数据格式的HTTP消息支持application/x-www-form-urlencodedmultipart/form-data类型,可用于标准表单提交和文件上传
ByteArrayHttpMessageConverter处理二进制数据格式的HTTP消息适用于图片传输、文件下载等二进制数据场景
Jaxb2RootElementHttpMessageConverter实现XML数据的序列化与反序列化基于JAXB API
SourceHttpMessageConverter处理基于javax.xml.transform.Source的XML消息适用于XML源数据的传输场景
ResourceHttpMessageConverter处理资源文件类型的HTTP消息适用于文件下载等资源访问场景

二、项目应用

1.项目需求

初步开发完员工管理模块的员工分页查询功能后,测试发现如下问题:

可以看到,最后操作时间的格式并不符合预期,这是因为后端响应给前端的日期时间数据没有进行格式化处理。

解决方法有以下2种:

  • 单个处理:在相关属性上加上@JsonFormat(pattern="")注解,对日期时间进行格式化处理;

  • 统一处理:在WebMvcConfig中扩展SpringMVC的消息转换器,统一对日期时间类型的数据进行格式化处理。

2.扩展SpringMVC的消息转换器

涉及到的文件如下:

sky-common:json:JacksonObjectMappersky-server:config:WebMvcConfig

2.1 创建对象转换器JacksonObjectMapper
/** * 对象转换器:基于jackson将Java对象转为json,或者将json转为Java对象 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] */publicclassJacksonObjectMapperextendsObjectMapper{publicstaticfinalDateTimeFormatterDEFAULT_DATE_TIME_FORMATTER=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");publicstaticfinalDateTimeFormatterDEFAULT_DATE_FORMATTER=DateTimeFormatter.ofPattern("yyyy-MM-dd");publicstaticfinalDateTimeFormatterDEFAULT_TIME_FORMATTER=DateTimeFormatter.ofPattern("HH:mm:ss");publicJacksonObjectMapper(){super();// 收到未知属性时不报异常this.configure(FAIL_ON_UNKNOWN_PROPERTIES,false);// 反序列化时,属性不存在的兼容处理this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);SimpleModulesimpleModule=newSimpleModule().addDeserializer(LocalDateTime.class,newLocalDateTimeDeserializer(DEFAULT_DATE_TIME_FORMATTER)).addDeserializer(LocalDate.class,newLocalDateDeserializer(DEFAULT_DATE_FORMATTER)).addDeserializer(LocalTime.class,newLocalTimeDeserializer(DEFAULT_TIME_FORMATTER)).addSerializer(LocalDateTime.class,newLocalDateTimeSerializer(DEFAULT_DATE_TIME_FORMATTER)).addSerializer(LocalDate.class,newLocalDateSerializer(DEFAULT_DATE_FORMATTER)).addSerializer(LocalTime.class,newLocalTimeSerializer(DEFAULT_TIME_FORMATTER));// 注册功能模块:例如,可以添加自定义序列化器和反序列化器this.registerModule(simpleModule);}}
2.2 在WebMvcConfig中扩展SpringMVC的消息转换器
/** * 配置类,注册web层相关组件 */@ConfigurationpublicclassWebMvcConfigextendsWebMvcConfigurationSupport{// 设置静态资源映射@OverrideprotectedvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}// 扩展SpringMVC消息转换器,统一对日期时间类型进行格式化处理@OverrideprotectedvoidextendMessageConverters(List<HttpMessageConverter<?>>converters){// 创建一个消息转换器对象MappingJackson2HttpMessageConverterconverter=newMappingJackson2HttpMessageConverter();// 设置对象转换器,可以将Java对象序列化为json字符串converter.setObjectMapper(newJacksonObjectMapper());// 将我们设置的对象转换器放入SpringMVC的消息转换器中的第一位置,最优先使用converters.add(0,converter);}}
http://www.jsqmd.com/news/327025/

相关文章:

  • 不想写大量 if 判断?试试用规则执行器优化,就很丝滑!
  • Redis快速实现布隆过滤器
  • 完整教程:蓝牙智能硬件常见报错处理(连接失败、数据丢包、设备搜索不到)
  • Godot开发问题记录:无法为节点拖拽添加脚本(godot显示禁止图标)
  • 深度硬核|.xr勒索病毒逆向分析与数据救援实战指南(附IOCs排查脚本)
  • 金融风控系统中的实时数据库技术实践
  • 广州PHP开发服务选择指南:如何寻找靠谱的技术合作伙伴
  • 巴菲特的创新能力评估:分布式创新网络的价值创造
  • 鸿蒙中级课程笔记7—给应用添加通知
  • 2026-01-31 ChpoBERT:面向中文政策文本的预训练模型
  • 从零到一:一个广州兼职PHP项目的敏捷交付与长期维护实践
  • 凌晨两点调 API 调到崩溃,直到 MCP 出现——AI 终于有了统一接口
  • 复现模拟退火、粒子群算法解约束最优化问题 内容: 程序一:模拟退火算法SA算法求解附图所示变速...
  • 3.MySQL 数据库集成 - 实践
  • 2026年广州PHP兼职全攻略:常见问题与狗蛋斯工作室实践
  • MCP 协议:让 AI 像插 USB 一样连接万物,我们在 Sealos 上跑通了
  • AI辅助API设计:提高接口的一致性与可用性
  • 1月31号
  • 实用指南:python+django/flask的结合人脸识别和实名认证的校园论坛系统
  • C++可变模板参数详细讲解
  • Java 基础全攻略:从语法到实战项目(简单总结)
  • 2024提示工程架构师技术路线图:最佳实践版(大厂都在用)!
  • Vue Day3
  • 2026年,学R语言,为什么399元的专栏真的很值,你只需要这一份资料,其它图文资料不再需要买了!
  • 大数据领域数据合规的最佳实践案例
  • 英语学习激励|基于java+vue的英语学习交流平台优秀的系统小程序(源码+数据库+文档)
  • 2024年ESWA SCI1区TOP,异构无人机配送问题的集成多目标优化方法,深度解析+性能实测
  • 【图像处理相关毕设选题选题指导】2026新颖优质选题推荐
  • Linux Lite 7.8重磅发布,12款核心应用全面重写,正式迈向Python + GTK4新时代!
  • 代码动态分析工具