• 一篇文章教你如何在项目中正确使用@DateTimeFormat注解和@JsonFormat注解


    前言

    项目中大家肯定都遇到过前端传时间参数给后端,最常见的时间格式为年月日(如:2022-10-26)或者就是带上时分秒的时间格式比如(2022-10-26 16:18:49),我们数据库一般都是使用时间戳格式(也就是带时分秒的时间格式),那么我们一般是如何处理时间格式的呢?通常有两种方法:
    方式一:
    实体类中采用字符串接收,然后再进行转换处理(此方法简单并且可以很方便的分辨出参数是否有误,但需要来回转换,因此比较繁琐,而且代码显得臃肿,因此我们不推荐该方式)
    方式二:
    实体类中直接采用时间格式去接收,因为本来就是时间,因此我们直接用时间格式才是最好的, 但是由于时间格式在java8之前是Date,并且由于Date并不能正确接收到时间 ,因此我们需要利用别的手段来帮助接收时间类型。我们常见的方式有给字段添加@DateTimeFormat或者@JsonFormat等注解的形式

    我看我们项目中这两个注解都有使用,而我自己不是很清晰这两个注解的使用场景及区别,因此查阅了网上的资料,但是我发现网上的文章里面很多都没有抓到重点(教大家如何区分什么时候使用哪个注解),我看其它文章里面都是强调如下内容,但是使用时的注意事项根本没有说明清楚

    注解@JsonFormat主要是后台到前台的时间格式的转换
    注解@DataFormAT主要是前后到后台的时间格式的转换

    提示:以上说法不是错误的,只是说法不全面而已

    一、@DateTimeFormat和@JsonFormat区别

    相同点

    • 两个注解都可以作用到字段上
    • 都可以对接收和返回的时间字段进行格式化(网上有些文章此处就说错了)

    不同点

    • @JsonFormat注解来源于jackson-databind-XXX.jar包中,SpringBoot项目引入spring-boot-starter-web时就会携带该jar包
    • @DateTimeFormat注解来源于spring-boot-XXX.jar包中,SpringBoot项目中会携带该jar包
    • 两个注解的使用场景不同

    提示:@DateTimeFormat和@JsonFormat注解一般是针对于Date和LocalDateTime类型使用,LocalDate类型不需要使用

    @DateTimeFormat

    1. 只能格式化前端传入的时间字符串转换成Date类型或LocalDateTime类型,不能格式化后端的日期字段给前端
    2. 仅支持前端使用表单键值对的请求提交方式(url拼接的参数才生效,如果是放到RequestBody中的form-data也是无效的)
    3. 不支持Json格式的请求提交方式(即不能格式化请求体中json参数)
    4. 适用于Get请求和Post请求

    @JsonFormat

    1. 该注解既可以格式化前端传给后端的参数,也可以格式化后端传给前端的参数
    2. 仅支持Json格式的请求提交方式(即可以格式化请求体中json参数)
    3. 不支持前端使用表单键值对的请求提交方式(url拼接的参数无效)
    4. 适用于Get请求和Post请求

    二、@DateTimeFormat和@JsonFormat的使用

    @DateTimeFormat

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date date;
    
    • 1
    • 2

    @JsonFormat

    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date date;
    
    • 1
    • 2

    三、小结

    根据上面的区别我们就很容易的区分处何时用哪个注解了吧,小面小结一下吧:

    @DateTimeFormat

    1. 适用于GET请求中请求参数场景,因为GET请求是将参数添加到url后面的

    @JsonFormat

    1. 适用于POST请求且请求参数是以json格式发送的场景
    2. 后端响应给前端的实体类中
  • 相关阅读:
    Docker下载与安装(2020)
    【计算机毕业设计】python在线课程培训学习考试系统637r7-PyCharm项目
    Jenkins--基础--6.2--Pipeline--语法--声明式
    使用java代码对pdf进行切割
    快速幂算法
    Linux操作系统~尝试自己制作并使用动静态库
    力扣 -- 712. 两个字符串的最小ASCII删除和
    解决React遍历每次渲染多个根元素导致无法为元素赋值key的问题
    bukku ctf(刷题2)
    计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 原文地址:https://blog.csdn.net/lingerlan510/article/details/127540029