企业开发(日期格式处理)——注解 @JsonFormatvs VS 消息转换器?

news2024/12/23 10:50:12

在企业级应用程序开发中,日期是一个常见但又容易被忽视的问题。正确处理日期格式对于系统的正确性和用户体验至关重要。在本文中,我们将探讨两种常见的方式来处理日期格式:通过注解和通过扩展Spring MVC的消息转换器,以及它们各自的优缺点。

引言:日期在企业级应用中的重要性

在现代软件开发中,日期不仅仅是一个简单的数据类型。它们通常承载着时间戳、时区、格式等信息,因此,对日期进行正确处理变得至关重要。无论是从前端接收数据,还是向前端返回数据,我们都需要确保日期格式的一致性和正确性。

注解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

这是处理日期格式的一种常见方法,特别适用于处理单个实体类的日期格式。通过在实体类的属性上添加 @JsonFormat 注解,我们可以指定日期的格式,如下所示:

public class User {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
private Date registrationDate; 
 }
优点:
  1. 简单直观:通过在实体类的属性上添加注解,可以直观地指定日期格式,使得代码易于理解和维护。

  2. 局部化:每个实体类都可以根据自身需要指定不同的日期格式,灵活性较高。

缺点:
  1. 重复性:如果多个实体类都需要相同的日期格式,就需要在每个实体类的属性上重复添加注解,增加了重复代码和维护成本。

  2. 耦合性:将日期格式的处理逻辑直接写在实体类中,使得实体类与日期格式处理逻辑耦合在一起,不利于解耦和复用。

有什么方法可以做到一劳永逸,设置一处让所有代码都可以在需要时转换格式?

消息转换器统一处理日期格式

另一种常见的方式是通过扩展Spring MVC的消息转换器来统一处理日期格式。我们可以创建一个自定义的消息转换器,然后在 WebMvcConfiguration 中注册它,如下所示:

在我们的WebMvcConfiguration配置类中,继承的WebMvcConfigurationSupport类

可以重写一个方法extendMessageConverters

 /**
     * 扩展SpringMVC框架消息转换器 ————统一给后端返回给前端的数据转换处理,如日期类型的
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器。。。");
//        创建一个消息转换器对象
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//        需要为消息转换器设置一个--对象转换器,对象转换器可以将java对象序列化为JSON数据
        converter.setObjectMapper(new JacksonObjectMapper());
//        将自己的消息转换器加入容器converters中 参数0表示索引,让它排在前面优先
        converters.add(0,converter);
    }

其中需要为消息转换器设置一个对象转换器:new JacksonObjectMapper() 

对象转换器是基于jackson将Java对象转为json,或者将json转为Java对象

其代码可以这样写:

public class JacksonObjectMapper extends ObjectMapper {

   
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
   

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
              

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}
在调试时可以看到,容器里从原来有的7个变成里8个,我们所添加的在第0个的位置👇

优点:
  1. 统一处理:通过扩展消息转换器,可以统一处理所有日期格式,无需在每个实体类中重复添加注解,提高了代码的复用性和可维护性。

  2. 解耦合:将日期格式处理逻辑从实体类中分离出来,降低了实体类与日期格式处理逻辑的耦合性,使得代码更加清晰和易于维护。

缺点:
  1. 全局化:消息转换器是全局性的配置,可能会影响到系统的其他部分,需要谨慎处理,避免意外影响。

  2. 不够灵活:消息转换器是全局性的配置,可能无法满足每个实体类不同的日期格式需求,需要权衡灵活性和统一性。

结论

在实际企业开发中,日期格式的处理方式需要根据具体的业务需求和系统架构来选择。对于单个实体类的日期格式处理,可以使用注解 @JsonFormat 来实现,简单直观;而对于全局性的日期格式处理,可以通过扩展消息转换器来实现,统一处理所有日期格式,降低耦合性,提高代码的复用性和可维护性。选择合适的日期格式处理方式,可以使系统更加健壮和易于维护,提高开发效率和用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python-VBA函数之旅-zip函数

目录 一、zip函数的常见应用场景 二、zip函数使用注意事项 三、如何用好zip函数&#xff1f; 1、zip函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、zip函数的常见…

网络3--网络通信的深度理解(端口号)

网络通信的进一步理解 两个主机间进行通信&#xff0c;其实是两个主机间的软件进行通信&#xff0c;软件也就是可执行程序&#xff0c;运行时就是进程&#xff0c;所以也为进程间通信。 进程间通信需要共享资源&#xff0c;这里两个主机间的共享资源是网络&#xff0c;利用的是…

MVP产品设计与数据指标

MVP&#xff08;minimum viable product&#xff0c;最小化可行产品&#xff09;概念最早由埃里克莱斯提出&#xff0c;刊载于哈弗商业评论&#xff0c;并有出版物《精益创业》 和常规产品不同&#xff0c;MVP更侧重于对未知市场的勘测&#xff0c;用最小的代价接触客户的方法…

修改远程服务器Nginx默认端口

目录 前言 正文 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach me by url below:My Blo…

Scala编程基础1:基本数据类型、变量、if、for、IO

注意&#xff1a;Scala系列的文章需要一定的java基础 Scala底层是用java语言编写的&#xff0c;scala是运行在Java虚拟机&#xff08;JVM&#xff09;上的编程语言&#xff0c;它兼容Java&#xff0c;可以直接调用Java的库和框架&#xff0c;并与Java代码无缝集成和互操作。 …

【C语言习题】6.逆序输出

文章目录 1.描述输入描述&#xff1a;输出描述&#xff1a;示例图&#xff1a; 2.解题思路3.具体代码4.代码讲解 1.描述 输入10个整数&#xff0c;要求按输入时的逆序把这10个数打印出来。逆序输出&#xff0c;就是按照输入相反的顺序打印这10个数。 输入描述&#xff1a; 一…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3&#xff0c;并实现了一些简单的问答&#xff0c;但是问答的界面是在命令提示符中&#xff0c;交互很不友好&#xff0c;也不方便局域网其他用户访问&#xff0c;所以这节用docker部署MaxKB实现网页访问llama3&#xff0c;首先电脑上需要…

【面试必看】MySQL部分

MySQL 1. 基础 1. 什么是关系型数据库&#xff1f; 一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#xff09;。各种表中&#xff08;比如用户表&#xff09;&#xff0c;表中的每一行就存放着一条…

基于jsp+servlet的网上商城

网上商城系统&#xff08;jspservlethtmlcssjsbootstrap&#xff09; 一、运行项目 在项目的doc文件夹下&#xff0c;有文档&#xff0c;教您怎么启动项目。 二、运行截图 a.项目前端页面 b.后台登录界面 c.后台展示界面 三、用户名和密码 前台的用户名是&#xff1a;mor…

webpack并行构建示例:

由于js的单线程特性&#xff0c;文件和任务时 要等待一个任务执行完成后执行下一个任务&#xff0c;但在实际开发中&#xff0c;很多任务是可以并行执行的&#xff08;如同时处理多个不同js文件或同事压缩多张图片&#xff09;&#xff0c;一些loader和插件&#xff08;thread-…

apk反编译修改教程系列-----利用反编译辅助软件 轻松去除apk强制更新弹窗_2 [十八】

上期解析了去除软件强制更新的几种方式。在反编译apk操作中不管那种操作都要根据编译的软件性质来决定,没有那种方法通用于所有的软件 。例如去除更新弹窗。有的只需要修改版本号就可以了。有的需要好几种方法结合来操作去除。前面也讲了几款推荐的辅助编译工具,今天以其中的…

Selenium 自动化 —— 四种等待(wait)机制

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​ 目录 目录 需要等待的场景 自己实现等待逻辑 Selenium 提供的三种等待机制 隐式等待&#xff08;Implicit Waits&#xff09; 隐式等待的优点 隐式等待的缺点 …

山西省特岗教师报名流程及报名照片处理方法

山西省2024年特岗教师招聘公告已发布&#xff0c;计划招聘特岗教师1800名&#xff0c;这对于有志于教育事业的高校毕业生来说&#xff0c;无疑是一个极好的机会。本文将详细介绍报名流程&#xff0c;并提供报名照片处理的方法&#xff0c;帮助应聘者顺利通过报名环节。 一、报名…

USB3.0接口——(2)数据结构

1.数据结构 在 USB 3.0 及更高版本的 xHCI 协议中&#xff0c;“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。 1.1.Rings Rings是指一种数据结构&#xff0c;用于组织和管理 USB 数据传输和事件。…

走进Java接口测试之多数据源切换示例

文章目录 一、前言二、demo实现2.1、开发环境2.2、构建项目2.3、配置数据源2.4、编写配置文件2.5、编写Dao层的mapper2.6、编写实体成层2.7、编写测试类2.8、验证结果 三、多数据源 demo 实现3.1、配置数据源3.2、增加pom文件3.3、修改数据源读取方式&#xff1a;3.4、增加动态…

Redis-持久化操作-AOF

持久化操作-AOF AOF是什么&#xff1f; 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只允许加文 件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换言之…

UE5C++ FString做为参数取值时报错error:C4840

问题描述 用来取FString类型的变量时报错&#xff1a; 问题解决 点击错误位置&#xff0c;跳转到代码&#xff1a; void AMyDelegateActor::TwoParamDelegateFunc(int32 param1, FString param2) {UE_LOG(LogTemp, Warning, TEXT("Two Param1:%d Param2:%s"), param…

【案例】使用Vue实现标题项元素上下移动

效果图 效果说明 每一组数据只能在对应的二级类目中进行上下移动&#xff0c;当点击上移图标的时候【左边的】会将当前元素与上一个元素交换位置&#xff0c;当点击的元素为该组的第一个元素时&#xff0c;将提示已经是第一项了并且不能进行移动&#xff1b;当点击下移图标的时…

03-数据结构(一)

链接&#xff1a;C# 数据结构_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1a541147Nk/?spm_id_from333.337.search-card.all.click&vd_source6eb7d966aa03ff5cb02b63725f651e68 链接&#xff1a;使用 C#.Net 学习掌握数据结构 (更新中)_哔哩哔哩_bilibili 一…

aws s3

列出关键点 创建s3 设置s3策略&#xff0c;所有人访问 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", …