news 2026/5/30 13:27:47

苍穹外卖之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/5/23 22:32:43

不想写大量 if 判断?试试用规则执行器优化,就很丝滑!

前言&#xff1a;只有体验过几百行 if else 折磨的人&#xff0c;才会对本篇产生共鸣&#xff01; 1业务场景 近日在公司领到一个小需求&#xff0c;需要对之前已有的试用用户申请规则进行拓展。我们的场景大概如下所示: if (是否海外用户) {return false; }if (刷单用户) {r…

作者头像 李华
网站建设 2026/5/20 16:48:45

鸿蒙中级课程笔记7—给应用添加通知

注意本章实现的为本地通知 通知介绍 通知分类 根据内容样式划分 分类维度具体类型说明与用途&#x1f3a8; 按内容样式分类基础类型用于展示静态的文本或图片信息。模板类型用于展示动态变化的内容&#xff0c;最常见的是进度条。 基础通知分类 这是最常用的通知类型&…

作者头像 李华
网站建设 2026/5/30 8:23:58

AI辅助API设计:提高接口的一致性与可用性

AI辅助API设计:提高接口的一致性与可用性 关键词:AI辅助、API设计、接口一致性、接口可用性、API开发 摘要:本文聚焦于AI辅助API设计这一前沿话题,旨在深入探讨如何利用AI技术提高API接口的一致性与可用性。文章首先介绍了API设计的背景知识,包括目的、预期读者、文档结构和…

作者头像 李华
网站建设 2026/5/22 21:59:25

复现模拟退火、粒子群算法解约束最优化问题 内容: 程序一:模拟退火算法SA算法求解附图所示变速...

复现模拟退火、粒子群算法解约束最优化问题 内容&#xff1a; 程序一&#xff1a;模拟退火算法SA算法求解附图所示变速箱设计带约束最优化实际工程问题的自编MATLAB程序。 程序二&#xff1a;粒子群算法PSO算法求解附图所示变速箱设计带约束最优化实际工程问题的自编MATLAB程序…

作者头像 李华
网站建设 2026/5/22 16:55:36

双十一秒杀:如何让1万人同时抢1瓶水,系统却不崩?

想象一间小超市突然涌入1万人&#xff0c;目标都是货架上最后一瓶矿泉水&#xff0c;而你作为店长要保证不踩踏、不乱价、且有人真的能买到——这就是秒杀系统的核心挑战。 一、场景还原&#xff1a;为什么简单请求会“爆”&#xff1f; 普通商品页用户浏览10秒&#xff0c;下单…

作者头像 李华
网站建设 2026/5/23 17:13:13

五个值得关注的Python新库

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

作者头像 李华