@DateTimeFormat和@JsonFormat使用详解及注意事项_java 实体类 @jsonformat-程序员宅基地

技术标签: spring  json  

最近在项目中遇到一个问题,自己脑子进水滥用@DateTimeFormat及@JsonFormat注解,导致后端在格式化前端传过来的时间字符串疯狂报错,以下给出这两个注解使用上的注意事项以及出现问题的解决方案

首先描述一下问题出现的场景:前端传格式为“yyyy-MM-dd”的时间字符串(Get请求方式),后端在接收的DTO中的时间字段上使用@DateTimeFormat注解进行String到Date类型的转换,并指定pattern为“yyyy-MM-dd”,这个过程是没有问题的,但是我这个数据是需要透传到云平台去拉取数据的,这又涉及到后端也需要发起一次 http 的远程调用,这时候就出问题了,透传的请求DTO的数据是从先前的接收DTO中使用BeanUtil拷贝的,而@DateTimeFormat这个注解有个要求是请求的时间字符串格式必须和接收端指定的格式一致,但是这个注解只是做了String到Date类型的切换,转换后的结果实际 并不会 受到pattern指定的格式影响,也就是格式依旧是 Mon Sep 04 00:00:00 CST 2023 这样的格式,所以这个时候后端再发起一次http请求云平台就是将这个格式的字符串数据透传上去,而云平台也使用@DateTimeFormat注解(pattern = “yyyy-MM-dd”)去格式化就出现了前后格式不一致的问题,从而报错。

这里我自己尝试出来的两个解决方案;

一、 先将透传的数据先进行格式化为“yyyy-MM-dd HH:mm:ss”,然后通过请求参数拼在url上透传上去,云平台还是使用@DateFoemat注解将url上的这个日期字符串参数转成指定格式的Date类型参数,其实云平台并没有修改。

二、修改这次透传的请求方式为 POST,(透传是后端发起的跟前端没关系,前端不用改),然后云平台接收方式也为 POST,然后在云平台接口中使用 @RequestBody 注解,将参数放在请求body里,在接收DTO的参数上使用@JsonFormat注解即可。@JsonFormat会将body中的对应的日期字段json数据转成Date类型。

第二种方式更好,因为第一次在透传前需要多格式化一次,且需要将数据重新从Date转成String。

@DateTimeFormat和@JsonFormat的使用场景

@DateTimeFormat
  1. @DateTimeFormat一般用于 get请求路径传参form-data 的形式。
  2. @DateTimeFormat要求 传递的参数格式接收指定的pattern格式 一致,否则会报错。
  3. @DateTimeFormat只是做了字符串格式的时间数据转换成Date类型,但是转换后的结果并不会受到pattern格式的影响,也就是时间格式不一定是 yyyy-MM-dd 格式的。
  4. @DateTimeFormat可以用于方法参数上,实体类属性上。
@JsonFormat
  1. @JsonFormat适用于 post请求 的形式。 这个注解是对请求body的数据进行格式化,所以需要在接口加上@RequestBody注解,然后在接收DTO中加上@JsonFormat注解并指定pattern格式即可。
  2. @JsonFormat注解是jackson包中的一个注解,本身也是一个接口,借助jackson的解析库将json数据反序列化成Date类型数据,所以需要导入以下的包。
  3. @JsonFormat只能用于实体类属性上,不能用于方法参数上。
  4. @JsonFormat可用于处理Json数据和从数据库查出的Date类型数据。即可约束时间类型的请求数据格式和响应数据格式。
  5. 如果将@JsonFormat注解直接加在po上,则请求和返回的数据都会按照pattern指定的格式。
<!--Jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

注意事项(总结):

  1. @DateTimeFormat适用于get请求方式且参数传递方式为路径请求参数的方式和forn表单的方式。而@JsonFormat适用于post方式的参数传递。
  2. @DateTimeFormat的pattern不会实际影响转化后的Date的实际格式。而@JsonFormat会。
  3. @DateTimeFormat要求传递的参数格式必须和接收指定的格式一致。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50887774/article/details/132668138

智能推荐

[GIS算法] 2.1.1 空间关系的判定-知识储备_超图空间关系判定方法-程序员宅基地

文章浏览阅读1.9k次。关系运算【关系运算】检验两个集合对象的特定的拓扑空间关系的逻辑方法【怎么比较两个对象的拓扑空间关系呢?】基本方法: 1. 比较两个几何对象的内部、边界和外部的交集 2. 根据交集矩阵产生的实体就可以知道空间关系普通拓扑学【普通拓扑学】 1. 定义了内部、边界和外部 2. 但是这些概念适用于二维空间中的二维对象,要使用与二维空间中的一维和零维对象时,就需要组合拓扑..._超图空间关系判定方法

Qt动画实现饼图数据分段动态展示_qt 动画展示数据-程序员宅基地

文章浏览阅读1.1k次。整体效果使用Qt属性动画实现了一种动态饼图展开效果。效果图如下图:_qt 动画展示数据

c# 【委托】子窗体调用父窗体控件实例_setmainformtopmosthandle-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏9次。原文地址:http://blog.csdn.net/chazikai24/article/details/5855254下述代码,实现效果为:运行程序,点击form1的button1,弹出form2,点击form2上的button1,隐藏form1上的button2.下面更新了实现这个功能更简单的方法//form1代码 using System; using System._setmainformtopmosthandle

相机知识问答_mtk zsd是什么-程序员宅基地

文章浏览阅读2.1w次,点赞3次,收藏40次。A1、持续对焦和触摸对焦的工作原理;答:首先要了解一下对焦的工作原理。AF工作原理:就是通过微距移动镜头,sensor采集图像并传送给ISP处理,ISP把当前frame的对比度值(FV)记录下来并保存为A1,同时按照固定的step把镜头移动到下个位置。下个frame时,sensor又采集图像并传送给ISP处理,ISP把当前frame的对比度值(FV)记录下来并保存为_mtk zsd是什么

希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现-程序员宅基地

文章浏览阅读2.5w次,点赞60次,收藏487次。上一篇文章对希尔伯特-黄变换(HHT)的前世今生进行了介绍。不过在研究中通常并不是到希尔伯特-黄变换就停止了。而是要用到诸如希尔伯特谱、包络谱、边际谱、瞬时频率/幅值/相位等方法进一步分析。这些方法究竟是什么含义,以及怎样使用、怎样实现呢?一、希尔伯特谱(Hilbert Spectrum)希尔伯特谱是希尔伯特-黄变换得到的最直观结果,(上一篇文章中倒数第二张图——经过HHT的“疯狂的M”),其反映的是信号时间、瞬时频率和幅值之间的关系。该图谱可以用于分析包含混合分量信号中各分量随时间变化_包络谱

传统媒体如何借力微信-程序员宅基地

文章浏览阅读137次。文/@冰糖葫佬:关注新媒体与广告行业,研究品牌运营,热爱美剧文化,@我系曾仔_Silvia:关注新媒体,致力于品牌传播。 (@Jackey在钓鱼 @兔子-wen 对本文也有贡献) 微信用户超过2亿,传统媒体要怎样分一杯羹?当然,本文并不能为这个问题提供解决方案,但希望能把问题列得更清楚些、更具体些。 结合两种传统媒体在微信实践上的案例分享,以作抛砖引玉..._传统媒体如何借力微信评论

随便推点

微信小程序生态13-微信公众号自定义菜单、个性化菜单配置_微信开启服务器配置自定义菜单怎么设置-程序员宅基地

文章浏览阅读3.2k次。微信公众号自定义菜单栏的配置需要登录『微信公众平台』,依次选择 内容与互动—>自定义菜单 ,如下:在『菜单信息栏』中我们有3种类型的菜单可以选择:发送消息、跳转网页、跳转小程序。微信公众号的菜单栏很像浏览器网页上的导航栏,但是限于屏幕大小、生态属性,没法做的很花里胡哨,不过微信官方也在尽力帮助运营和开发者把菜单栏做的个性化一点。虽然上面的流程比较长,但只要好好看文档,实现这个功能也不难,核心就是把菜单配置好后,调用接口而已。IP白名单的配置微信签名校验解码菜单栏数据格式错误等等。_微信开启服务器配置自定义菜单怎么设置

【linux】软件工具安装 + vim 和 gcc 使用(上)_24.04 无法定位软件包vim-程序员宅基地

文章浏览阅读1.1k次,点赞119次,收藏94次。软件工具安装 + 一些vim 和 gcc 使用_24.04 无法定位软件包vim

Win10:路径长度超过260个字符_win10取消250字符限制-程序员宅基地

文章浏览阅读8.8k次,点赞4次,收藏15次。Win10:路径长度超过260个字符路径长度限制编辑注册表修改260个字符路径限制路径长度限制在Windows 95之前,Windows仅允许文件名长为八个字符,带有三个字符的文件扩展名(通常称为8.3文件名)。Windows 95放弃了允许长文件名的规定,但仍将最大路径长度(包括完整的文件夹路径和文件名)限制为260个字符。从那时起,这个限制就一直存在。编辑注册表修改260个字符路径限制点击“开始”并输入“ regedit”,打开注册表编辑器在注册表编辑器中找到FileSystemH_win10取消250字符限制

在IIS服务器下搭建FTP服务_iis ftp-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏72次。为了实现文件局域网或远程共享与访问,在IIS服务器手动搭建一个FTP Server共享服务。基于Windows 11 操作系统。_iis ftp

数据结构与算法系列笔记五:树_树的结点总数-程序员宅基地

文章浏览阅读713次。树的基础1 树的基本概念树:一种数据结构。是由n(n>=1)个有限结点组成一个具有层次关系的集合。树具有以下特点:每个结点有零个或多个子结点;没有父结点的结点为根结点;每一个非根结点只有一个父结点;每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;树的相关术语结点的度:一个结点含有的子树的个数称为该结点的度;树的度:树中所有结点的度的最大值叶结点:度为0的结点称为叶节点,也可以叫做终端结点;分支结点:度不为0的结点称为分支节点,也叫作非终端结点_树的结点总数

UVM——工厂(factory)机制和phase机制_uvm factory.print-程序员宅基地

文章浏览阅读6.1k次,点赞22次,收藏115次。文章目录一、factory工厂机制1.1. 登记注册1.2. 实例化对象1.3. 覆盖override1.4. 检查覆盖是否完成—factory.print()二、phase机制2.1. phase机制组成2.2. phase执行顺序一、factory工厂机制  在UVM中使用工厂模式基本上分为三个步骤。   1) Registration——登记;   2) Construction——..._uvm factory.print

推荐文章

热门文章

相关标签