Spring @DateTimeFormat日期格式化时注解浅析分享

news2025/1/15 14:21:19

文章目录

    • 总结写前面
    • 为什么用
    • 怎么用
      • 场景一
      • 场景二
      • 场景三
      • 场景四
      • 场景五
        • 方式一
        • 方式二

总结写前面

关于它 @DateTimeFormat

  1. 可以接收解析前端传入字符时间数据;
  2. 不能格式化接收的字符时间类型数据,需要的转换格式得配置;
  3. 入参格式必须与后端注解格式保持一致,否则会报错;

为什么用

场景:跟前端交互时,接收字符类型的时间值,就需要使用 @DateTimeFormat 注解来解析,否则就会报错;

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testOne")
    public DemoTest testOne(DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    private Date nowTime;
}

请求示例结果:

Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors<EOL>Field error in object 'demoTest' on field 'nowTime': rejected value [2022-11-20 16:42:26,2022-11-20 16:42:01]; codes [typeMismatch.demoTest.nowTime,typeMismatch.nowTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [demoTest.nowTime,nowTime]; arguments []; default message [nowTime]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Date' for property 'nowTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-11-20 16:42:26'; nested exception is java.lang.IllegalArgumentException]]

怎么用

场景一

接收非 JSON 格式请求参数。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
     @PostMapping("/testOne")
    public DemoTest testOne(DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:form-data
    在这里插入图片描述

从结果可以看出,@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 可以保证接收解析前端传入的字符时间参数,但是并不能完成时间格式化操作,如果需要获取想要的时间格式,是需要自己手动转换的。

场景二

接收 JSON 格式请求数据,与场景一的区别是请求的数据格式:

  • 场景一:form-data
  • 场景二:JSON
@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testTwo")
    public DemoTest testTwo(DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    在这里插入图片描述

从结果可以看出,返回数据 nowTime 是空的,因为这里的Controller层没有使用 @RequestBody 去接收 JSON 格式的数据,而 Spring 默认的转换器类型是不包含 JSON 的(有兴趣的可以看下 org.springframework.core.convert.support 包,这里面包含Spring支持的默认转换器)。

场景三

场景三跟场景二的区别就是,在 Controller 层方法入参配合使用 @RequestBody 去接收 JSON 格式,使用该注解会自动调用对应的JSON转换器。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON在这里插入图片描述

这里可以看到,请求报错400,导致400的原因比较多,这里只说明一下场景三,场景三中使用 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解格式与请求入参格式不一致,所以会导致请求报错;

在这里插入图片描述

大概意思就是说,Spring 框架在尝试转换参数的过程中,没有找到合适接收格式导致转换失败。(注意!注意!注意!讲三遍,所以前端入参格式必须与后端约定格式保持一致,否则会报错)。

场景四

场景四的目的是为了解决场景一中时间格式化的问题。

关于 @JsonFormat 注解,可以看看我的另一篇blog中有做分享,感兴趣的大佬可以去看看,附上传送门:@JsonFormat 和 @DateTimeFormat 时间格式化注解详解(不看血亏)

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:form-data在这里插入图片描述

场景五

方式一

针对场景四的数据请求格式是 form-data,场景五来说明 JSON 同样适用。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    在这里插入图片描述

方式二

可以继承 Spring 提供的org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer 来进行全局配置。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

@Configuration
public class CustomsDateConvert implements Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        String dateFormat = "yyyy-MM-dd HH";
        // 针对于Date类型,文本格式化
        jacksonObjectMapperBuilder.simpleDateFormat(dateFormat);
        // 针对于JDK新时间类。序列化时带有T的问题,自定义格式化字符串
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateFormat)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateFormat)));
        jacksonObjectMapperBuilder.modules(javaTimeModule);
    }
}

/**
 * 解决Jackson2ObjectMapperBuilderCustomizer失效问题
 */
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class ConvertConfiguration implements WebMvcConfigurer {

    @Autowired(required = false)
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
        if (Objects.isNull(mappingJackson2HttpMessageConverter)) {
            converters.add(0, new MappingJackson2HttpMessageConverter());
        } else {
            converters.add(0, mappingJackson2HttpMessageConverter);
        }

    }
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    在这里插入图片描述


感 谢 各 位 大 佬 的 阅 读,随 手 点 赞,日 薪 过 万~! !!

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

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

相关文章

罗丹明PEG羟基,RB-PEG-OH,Rhodamine-PEG-OH

产品名称&#xff1a;罗丹明PEG羟基 英文名称&#xff1a;RB-PEG-OH&#xff0c;Rhodamine-PEG-OH&#xff0c;Rhodamine PEG hydroxyl&#xff0c;RB-PEG-OH CAS&#xff1a;1030-000-8 结构式&#xff1a; 罗丹明吸收波长570 nm,发射波长约595 nm。罗丹明B可追踪粉红色和红…

Git——Git介绍及安装步骤

目录 一、Git概述&#xff1a;分布式版本控制工具 1.1 版本控制介绍 1.1.3为什么需要版本控制&#xff1f; 1.2 版本控制工具 1.2.1 集中式版本控制工具 1.2.2 分布式版本控制工具 1.3 工作机制和代码托管中心&#xff08;远程库&#xff09; 二、Git安装 2.1 官网下载安装…

用物理光学建模演示点阵投影仪的工作原理

摘要 点阵投影仪是启用Apple Face ID的关键组件。 该系统通常由发光单元阵列&#xff0c;透镜和分束光栅组成。 透镜系统与光栅一起投射&#xff0c;并复制阵列光源图案。 在此示例中&#xff0c;我们构建了这种点阵投影仪系统并演示了其工作原理。为进行系统分析&#xff0c;我…

[Java]枚举类

文章目录&#x1f34a; 枚举类理解&#x1f34a; 自定义枚举类&#x1f34a; 使用 enum 关键字定义枚举类&#x1f34a; Enum类的常用方法&#x1f96d; toString()&#x1f96d; Enum.valueOf(Class enumClass, String name)&#x1f96d; valueOf(String name)&#x1f96d; …

艾美捷Bio-Helix BluPAD双LED蓝白光照胶台丨舒适、方便

艾美捷Bio-Helix BluPAD双LED蓝白光照胶台&#xff08;切胶仪&#xff0c;透射仪&#xff09;&#xff0c;适用于各种生命科学研究领域&#xff0c;用于观察和分析核酸和蛋白质。鉴于其对凝胶切割、数据成像和归档等观察后应用的最优化和人性化设计&#xff0c;希望为研究人员提…

搭建包含swift组件的openstack云平台详解

由于今天做实验。。。 安装完成虚拟机仅主机模式和nat模式双网卡后&#xff0c;开启网卡进入界面直接ping百度&#xff0c;ping通直接执行下面操作 开启虚拟机&#xff0c;切换到root模式关闭防火墙 查看防火墙是否开启&#xff0c;如果开启请关闭&#xff08;出现Active: ac…

广东的介绍

附录&#xff1a; 1、画图工具&#xff1a;https://www.ldmap.net/map.html?id97f83161-ce02-4e11-989b-fb6645469320 广东之地 因字幅有限&#xff0c;故先列举最端。 巧合点 分隔各地&#xff0c;却有相同的点&#xff0c;是否有相同的影响因素。广东最南&#xff0c;最…

免费搜题接口

免费搜题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转&a…

[附源码]计算机毕业设计JAVA基于web鲜花销售系统论文2022

[附源码]计算机毕业设计JAVA基于web鲜花销售系统论文2022 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …

企业数据集成难?Qlik 与微软助你事半功倍

微软年度峰会 Ignite 2022 落下帷幕&#xff0c;正式推出微软智能数据平台&#xff0c;统一微软旗下数据库、数据分析和管理服务&#xff0c;一个基于微软云合规、安全等优势、云端数据平台 开发服务为核心的生态系统初见雏形。 Qlik 作为微软金牌合作伙伴&#xff0c;其数据…

思考思维(2):《极简思考》结构化思维

前言 之前在架构师成长之路(5)--架构师具备的思维_hguisu的博客-CSDN博客_架构思维能力已经总结过了&#xff0c;这里再次全面总结。 有一种人的口头禅是“我只说三点”&#xff0c;这种人通常很厉害。 有人三句话说明白一件事&#xff0c;有人说半天别人也没听懂在说啥。这是…

SpringCloud微服务(五)——Config分布式配置中心

SpringCloud Config分布式配置中心 SpringCloud 微服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对较小&#xff0c;因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行&#xff0c;所以一套集中式的、动态的配置管理设…

继承和多态

文章目录继承为什么要继承继承的概念继承的语法父类成员访问子类中访问父类的成员变量子类中访问父类的成员方法super关键字子类构造方法super和this再谈初始化protected关键字继承方式final关键字继承与组合多态多态的概念多态的实现条件重写向上转型和向下转型向上转型向下转…

GhostNetV2学习笔记

GhostNetV2学习笔记 GhostNetV2: Enhance Cheap Operation with Long-Range Attention Abstract 轻量级卷积神经网络(CNNs)是专为在移动设备上具有较快推理速度的应用而设计的。卷积运算只能捕获窗口区域的局部信息&#xff0c;这阻碍了性能的进一步提高。在卷积中引入自我注…

随时随地创建参数化3D模型—xDesign

在前文3DEXPERIENCE的文章里&#xff0c;我们给各位介绍了3DEXPERIENCE云平台的页面以及怎么点击到对应的平台角色和应用程序。 所以&#xff0c;接下来就给各位介绍云平台当中的应用程序的操作和使用方法。本篇文章主要介绍工程师们在工作中常要用到的3D建模的应用程xDesign&…

间隔一分钟按某个按键一次——VBS脚本

间隔一分钟按某个按键一次-VBS脚本 我们在玩游戏挂机的时候&#xff0c;有的时候长时间鼠标键盘不动一下&#xff0c;游戏就掉线了。或者居家办公出去做核酸检测&#xff0c;时间一长你的钉钉、企业微信等通讯工具就会显示离线状态&#xff0c;这个时候需要有个简易的小脚本帮…

第四章 决策树

4.1 基本流程 决策树是一类常见的机器学习方法。以二分类任务为例&#xff0c;其结构类似于二叉树。以西瓜问题为例&#xff0c;其结构如图所示&#xff1a; 一般的&#xff0c;一颗决策树包含一个根节点、若干个内部结点和若干个叶节点&#xff1b;叶节点对应决策结果&#…

全网最全斗音短视频新老账号起号技巧

大家好&#xff0c;我是我赢助手&#xff0c;专注于自媒体短视频去水印、去重和文案提取运营。 今天给大家分享下全网最全斗音短视频新老账号起号技巧 1、清理手机(手机登录新斗音号才需要清理) 安卓:打开设置-应用管理-斗音短视频-储存占用-清除缓存-卸载 双清方法:先在斗…

同花顺_代码解析_技术指标_Z_1

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 ZJ_01 ZJ_02 ZJ_05 ZMMZB ZNZ_ASR ZNZ_BYQD ZNZ_CBAND ZNZ_CBW ZNZ_CBXQD ZNZ_CKD ZNZ_CMACD ZNZ_CMGL ZNZ_CYBB ZJ_01 波段之星 "波段之星"指标为图形化指标。…

C---链表

目录链表的遍历计算链表节点个数查找结点节点后插入新节点节点前插入新节点1.目标节点为头节点 &#xff08;引起链表头变化&#xff09;2.目标节点不是头节点节点前插入新节点&#xff08;两种情况&#xff09;完整版删除节点课外知识&#xff1a;gcc ... -g1.删除头节点2.删的…