记一次DateTimeFormat注解的坑

记一次DateTimeFormat注解的坑

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

1. @DateTimeFormat

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

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

shell 复制代码
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.IllegalArgumentException
	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:133)
......

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

java 复制代码
    @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小时,主要是开发测试时还可能发现不了,我就是上生产时才发现的问题,还好影响不大。

相关推荐
叼烟扛炮1 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
文丑颜不良啊1 小时前
LeetCode2061~2080题目解析
java·leetcode
特立独行的猫A2 小时前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
Brookty2 小时前
Java博客项目实战|工程环境与构建:工程目录、PowerShell命令调用与JDK/IDEA/Maven工作机制
java·项目实战
养军博客2 小时前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
IT_陈寒2 小时前
SpringBoot实战技巧总结
前端·人工智能·后端
TeamDev2 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA2 小时前
String字符串[面试题]
java·开发语言
量化分析码农3 小时前
【Python量化多因子实战 05】因子也会轮动:因子动量与因子反转的择时应用
后端
陈随易4 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员