news 2026/9/23 10:31:16

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
苍穹外卖之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);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 13:39:53

阿里不推荐使用 keySet() 遍历HashMap?是有原因的

引言 HashMap相信所有学Java的都一定不会感到陌生&#xff0c;作为一个非常重用且非常实用的Java提供的容器&#xff0c;它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多种&#xff1a; 使用迭代器&#xff08;Iterator)。…

作者头像 李华
网站建设 2026/9/21 5:14:20

Godot开发问题记录:无法为节点拖拽添加脚本(godot显示禁止图标)

问题点&#xff1a;Godot开发过程中&#xff0c;出现无法拖拽C#脚本到节点的问题可尝试的解决方案&#xff1a;经测试&#xff0c;修改C#脚本的编码格式为UTF-8后&#xff0c;可以正确识别加载该脚本备注&#xff1a;对于双击godot编辑界面的cs脚本无法跳转到代码编辑器&#x…

作者头像 李华
网站建设 2026/9/12 15:24:56

2026年,学R语言,为什么399元的专栏真的很值,你只需要这一份资料,其它图文资料不再需要买了!

当前医药数据科学和R语言领域&#xff0c;网络上和书籍市面上一大堆资料&#xff0c;表面看起来琳琅满目&#xff0c;价格从几十元的书籍到动辄几千元一次的线下培训班都有。但绝大多数培训或书籍都受限于时间和篇幅&#xff0c;浅尝辄止&#xff0c;很多仅仅是基础入门&#x…

作者头像 李华
网站建设 2026/9/20 18:23:30

在你的Node.js项目中轻松集成WhatsApp功能!

WhatsApp Web.js&#xff1a;轻松构建Node.js WhatsApp客户端的最佳解决方案 在现代通信中&#xff0c;WhatsApp已经是一个不可或缺的工具&#xff0c;不论是个人还是企业都在使用WhatsApp与客户沟通。今天&#xff0c;我们向大家介绍一个强大的开源库——WhatsApp Web.js&…

作者头像 李华
网站建设 2026/8/29 20:30:32

图片画质增强神器!模糊照片秒变高清

下载链接 https://pan.freedw.com/s/NN5rm8 今天发现个超好用的画质增强工具&#xff0c;不用安装解压就能用&#xff0c;再也不用为模糊照片发愁了&#xff01;不管是老照片修复还是手机拍糊了的图片&#xff0c;这个软件都能一键处理成高清画质。 软件主要分图片增强和视频…

作者头像 李华
网站建设 2026/9/15 3:30:01

使用Pandas进行数据分析:从数据清洗到可视化

SQLAlchemy是Python中最流行的ORM&#xff08;对象关系映射&#xff09;框架之一&#xff0c;它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。 目录 安装SQLAlchemy 核心概念 连接数据库 定义数据模型 创建数据库表 基本CRUD操作…

作者头像 李华