一篇文章教你如何在项目中正确使用@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;

@JsonFormat

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

三、小结

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

@DateTimeFormat

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

@JsonFormat

  1. 适用于POST请求且请求参数是以json格式发送的场景
  2. 后端响应给前端的实体类中

你可能感兴趣的:(JAVA之实用基础,java)