记一次DateTimeFormat注解的坑

这篇具有很好参考价值的文章主要介绍了记一次DateTimeFormat注解的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记一次DateTimeFormat注解的坑

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

1. @DateTimeFormat

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

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

记一次DateTimeFormat注解的坑,java,后端

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,问题解决,如下所示

    @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小时,主要是开发测试时还可能发现不了,我就是上生产时才发现的问题,还好影响不大。文章来源地址https://www.toymoban.com/news/detail-805083.html

到了这里,关于记一次DateTimeFormat注解的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次 .NET 某游戏服务后端 内存暴涨分析

    前几天有位朋友找到我,说他们公司的后端服务内存暴涨,而且CPU的一个核也被打满,让我帮忙看下怎么回事,一般来说内存暴涨的问题都比较好解决,就让朋友抓一个 dump 丢过来,接下来我们用 WinDbg 一探究竟。 拿到 dump 之后,首先要判断是托管还是非托管问题,这决定了

    2024年02月15日
    浏览(51)
  • 记一次 .NET某游戏后端API服务 CPU爆高分析

    前几天有位朋友找到我,说他们的API服务程序跑着跑着CPU满了降不下去,让我帮忙看下怎么回事,现在貌似民间只有我一个人专注dump分析,还是申明一下我dump分析是免费的,如果想学习.NET高级调试的分析技术,可以来我的训练营看看,话不多说,dump分析走起! 昨天录了一

    2024年03月21日
    浏览(43)
  • @DateTimeFormat注解

    前言 前言在使用@DateTimeFormat进行格式化注解时,总是不能匹配前端传入的。格式总是报错 我这里使用的是pattern进行解析的的但是前端是给我传入的ISO类型的导致不能匹配所以总是报错。后来我们进行查看源码得到了答案。 源码解析 看下源码解析: 那么我们来看下。后端使

    2023年04月08日
    浏览(33)
  • @DateTimeFormat 和 @JsonFormat 注解详解

    这一篇文章足以让你对Java当中Date时间上的理解更上一层楼,本篇文章主要通过代码的形式来进行试验,彻彻底底搞明白日期传参,以及日期返回参数的格式相关问题,每一个步骤都会记得特别详细! 本篇文章主要针对以下三点,来进行代码试验: 不使用这两个注解,前端传

    2024年02月04日
    浏览(32)
  • SpringBoot复习(30):@DateTimeFormat注解的使用

    一、实体类 二、控制器类:

    2024年02月13日
    浏览(39)
  • 前后端时间传递之注解形式(@DateTimeFormat与@JsonFormat)

    在我们开发的过程中常常会遇到前后端传递时间的问题,同样笔者也是遇到了这样的问题,以前笔者的做法是在代码中转换:前端传String类型的时间,然后后端用String接收以后存入数据库时再转化为Date;返回给前端时也是一样,先从数据库中查出Date类型的数据,返回给前端

    2024年02月05日
    浏览(34)
  • Spring @DateTimeFormat日期格式化时注解浅析分享

    关于它 @DateTimeFormat : 可以接收解析前端传入字符时间数据; 不能格式化接收的字符时间类型数据,需要的转换格式得配置; 入参格式必须与后端注解格式保持一致,否则会报错; 场景:跟前端交互时,接收字符类型的时间值,就需要使用 @DateTimeFormat 注解来解析,否则就

    2024年02月03日
    浏览(32)
  • JAVA开发(记一次504 gateway timeout错误排查过程)

    一、问题与背景: 最近在发布一个web项目,在测试环境都是可以的,发布到生产环境通过IP访问也是可以的,但是通过域名访问就出现504 gateway timeout。通过postman去测试接口也是一样。ip和端口都可以通,域名却不行,百思不得其解。通过一顿百度搜索,解析说通过nginx配置文

    2024年02月11日
    浏览(43)
  • 📑 记一次Java源码编译,三方包下载不下来的问题处理

    dataease 项目后端的源码编译问题 dataease后端项目,pom里有一个包,无法下载。源码里的定义如下: 项目后端pom定义 关于classifier标签,大概用处是,如果一个Maven目录里有多个包,通过这个标签,决定,到底从目录里选择哪个包来引入。 举个例子,如果不加该标签,那么就会

    2024年03月25日
    浏览(49)
  • 记一次OJ在线代码编辑器(代码编译+运行,C、C++、Java)

    如何在SpringBoot+Vue的项目中实现在线代码编译及执行(支持编译运行C、C++、Java),研究了一天,真实能用,下面直接上源码!!! —————————————————————————————————————————— (1)C编译执行方法(直接调用,传入字符串即

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包