springboot2中使用@JsonFormat注解不生效的解决

下面我将为您详细讲解“springboot2中使用@JsonFormat注解不生效的解决”的完整攻略。

下面我将为您详细讲解“springboot2中使用@JsonFormat注解不生效的解决”的完整攻略。

背景

在使用 Spring Boot 2.x 开发 Web 应用时,经常需要将 Java 对象转换成 JSON 格式数据,这时候就需要使用到 Jackson 序列化工具。在使用 Jackson 序列化的过程中,我们可以通过 @JsonFormat 注解来控制时间类型等数据格式。但在 Spring Boot 2.x 中,由于默认启用了 Jackson 2.9.x,导致 @JsonFormat 注解不生效的问题。

当使用 @JsonFormat 对日期类型进行格式化时,结果会返回默认的日期格式,而非我们指定的格式。例如:

{
  "id": 1,
  "name": "张三",
  "birthday": "2022-09-03T07:23:08.042+00:00"
}

我们指定格式时,期望输出的日期格式为 yyyy-MM-dd,但实际结果中包含了时间戳和时区信息,这是由于 @JsonFormat 注解不生效的原因导致的。

解决方法

为了解决 @JsonFormat 注解不生效的问题,我们可以通过以下两种方式来实现:

方案一:配置全局 Jackson 序列化器

我们可以通过配置全局 Jackson 序列化器,来统一处理 Web 应用的 JSON 序列化。在配置文件中添加如下配置:

spring:
  jackson:
    date-format: yyyy-MM-dd
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false

这里我们指定了 date-formatyyyy-MM-ddtime-zoneGMT+8write-dates-as-timestampsfalse,即不输出时间戳。

方案二:自定义 Jackson 序列化器

除了全局配置外,我们还可以通过自定义 Jackson 序列化器来解决 @JsonFormat 注解不生效的问题。具体实现方法如下:

  1. 创建自定义序列化器类,实现 JsonSerializer 接口:
public class CustomDateSerializer extends JsonSerializer<Date> {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeString(dateFormat.format(value));
    }
}

该序列化器用于将 Date 类型的属性序列化为指定格式的字符串。

  1. 在属性上添加 @JsonSerialize 注解,指定使用自定义序列化器类:
public class User {
    private Integer id;
    private String name;
    @JsonSerialize(using = CustomDateSerializer.class)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
}

该注解标记的属性在输出 JSON 格式数据时,会使用指定的序列化器进行数据格式转换。

示例说明

为了更加清晰地理解上述解决方案,我们来看两个示例:

示例一:配置全局 Jackson 序列化器

application.yml 中添加如下配置:

spring:
  jackson:
    date-format: yyyy-MM-dd
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false

编写控制器:

@RestController
public class UserController {
    @GetMapping("/")
    public User getUser() {
        User user = new User();
        user.setId(1);
        user.setName("张三");
        user.setBirthday(new Date());
        return user;
    }
}

定义实体类:

public class User {
    private Integer id;
    private String name;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
}

访问 http://localhost:8080/,返回结果如下:

{
  "id": 1,
  "name": "张三",
  "birthday": "2022-09-03"
}

示例二:自定义 Jackson 序列化器

编写自定义序列化器类:

public class CustomDateSerializer extends JsonSerializer<Date> {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeString(dateFormat.format(value));
    }
}

在实体类中使用自定义序列化器类:

public class User {
    private Integer id;
    private String name;
    @JsonSerialize(using = CustomDateSerializer.class)
    private Date birthday;
}

访问 http://localhost:8080/,返回结果仍然如下:

{
  "id": 1,
  "name": "张三",
  "birthday": "2022-09-03"
}

以上就是关于“springboot2中使用@JsonFormat注解不生效的解决”的完整攻略,我希望能帮助到您!

本文标题为:springboot2中使用@JsonFormat注解不生效的解决

基础教程推荐