记一次DateTimeFormat注解的坑

2024-01-19 03:36

本文主要是介绍记一次DateTimeFormat注解的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记一次DateTimeFormat注解的坑

背景:在用Echarts做图表时,前端传两个日期参数,获取日期区间的图表数据。想遵循RESTful风格,所以使用get请求获取date参数。前端读取当前日期,将七天前日期和当前日期作为参数传给后端,后端通过Date参数接收。然后后端报错,无法识别前端的date参数。经查阅,可以通过@DateTimeFormat标注在QueryString参数上可解决报错。然后发现DateTimeFormat接收前端的date参数时会比实际时间少8小时。

1. @DateTimeFormat

@DateTimeFormat注解是springboot内置的时间格式化注解,将@DateTimeFormat标注在RequestParam参数上。可以格式化DateTime参数。

假如不使用@DateTimeFormat,且前端传date对象,后端用Date接收,会导致错误

在这里插入图片描述

org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value [2024-01-11]; nested exception is java.lang.IllegalArgumentExceptionat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:133)
......

加上@DateTimeFormat,问题解决,如下所示

    @GetMapping("statData")public Result statData(@DateTimeFormat(pattern="yyyy-MM-dd") Date start,@DateTimeFormat(pattern="yyyy-MM-dd") Date end){List<Integer> integers = blogIncreaseService.statData(start, end);return ResultUtils.success().data(integers);}

2. 提前8小时问题

前端如果传的date,后端用Date接收(用@DateTimeFormat(pattern="yyyy-MM-dd"标识),会导致后端接收的数据比实际系统数据早8小时(不知道是前端获取时间时区问题还是怎么的)。这不符合我们的实际需求。

解决方案有三种

    1. 在以上基础上,后端接收的Date数据基础上加上8小时。
    1. 放弃使用Get请求,用Post,用RequestBody接收前端请求数据,在日期参数上使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)格式花日期。@JsonFormat可以格式化时区,@DateTimeFormat没有timezone参数
    1. 继续使用@DateTimeFormat,但前端不传date对象,改用字符串。

个人感觉还是第三种方案最好,如果前端开发小姐姐配合的话。

具体解决步骤不列举了,比较简单,重点是最近我很懒,懒得写笔记。

总结

总而言之,使用@DateTimeFormat时注意留意是否提前8小时,主要是开发测试时还可能发现不了,我就是上生产时才发现的问题,还好影响不大。

这篇关于记一次DateTimeFormat注解的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621143

相关文章

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

电脑多久清理一次灰尘合? 合理清理电脑上灰尘的科普文

《电脑多久清理一次灰尘合?合理清理电脑上灰尘的科普文》聊起电脑清理灰尘这个话题,我可有不少话要说,你知道吗,电脑就像个勤劳的工人,每天不停地为我们服务,但时间一长,它也会“出汗”——也就是积累灰尘,... 灰尘的堆积几乎是所有电脑用户面临的问题。无论你的房间有多干净,或者你的电脑是否安装了灰尘过滤器,灰尘都

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是