@DateTimeFormat@JsonFormat 是 Spring 和 Jackson 中用于处理日期时间格式的注解,它们有不同的作用:

@DateTimeFormat

@DateTimeFormat 是 Spring 框架提供的注解,用于指定字符串如何转换为日期时间类型,以及如何格式化日期时间类型成字符串。通常用于 Spring MVC 控制器方法的参数或对象属性上。

示例用法:

public class MyRequest {
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date date;
    
    // getters and setters
}

在这个示例中,@DateTimeFormat 注解指定了日期字符串的格式,以便将其转换为 Date 类型。

@JsonFormat

@JsonFormat 是 Jackson 库提供的注解,用于指定 JSON 序列化和反序列化时日期时间类型的格式。通常用于 POJO 类的属性上,以影响 JSON 格式的输出。

示例用法:

public class MyResponse {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dateTime;
    
    // getters and setters
}

在这个示例中,@JsonFormat 注解指定了日期时间的格式,以便 JSON 序列化和反序列化时使用。

区别

  • @DateTimeFormat 是 Spring 框架提供的,用于处理字符串到日期时间类型的转换和格式化。
  • @JsonFormat 是 Jackson 库提供的,用于处理 JSON 格式到日期时间类型的转换和格式化。

虽然它们的功能有些重叠,但它们的使用场景不同:@DateTimeFormat 用于处理 HTTP 请求参数的转换,而 @JsonFormat 用于处理 JSON 数据的序列化和反序列化。

实际应用场景

Controller中使用Java对象接收前端传来的查询参数,这个时候需要使用@DateTimeFormat来格式化前端传来的日期格式,如果这个对象只是作为查询参数,那么只需要加@DateTimeFormat 这一个注解就够了,如果同时作为返回VO,那么就得加上 @JsonFormat用于 JSON 数据的序列化和反序列化。
还有一个场景,就是对象虽然没有作为VO使用,但是作为Feign接口的查询对象,这个时候也涉及了 JSON 数据的序列化和反序列化,所以也得加上@JsonFormat。另外,Feign不支持使用GET请求但是使用对象作为参数,如果要使用对象作为参数,必须适应POST方法。