如何在使用Jackson对Java 8日期时间类进行序列化和反序列化时解决"Java 8日期/时间类型默认不支持"的错误

543 阅读1分钟

学习如何在使用Jackson对Java 8日期时间类进行序列化和反序列化时解决"Java 8日期/时间类型默认不支持"的错误。

1.1.问题

当我们序列化一个Java对象或反序列化JSON到POJO,并且POJO包含新的Java 8日期时间类,如LocalDate,LocalTime,LocalDateTime等,就会发生这个错误。

例如,下面这个Employee类有LocalDate类型的字段。

public class Employee {

  private Long id;
  private String name;
  private LocalDate dateOfBirth;
}

当我们序列化这个类的一个实例时,我们得到以下的异常。

Exception in thread "main" java.lang.IllegalArgumentException: Java 8 date/time type `java.time.LocalDate` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.howtodoinjava.core.objectToMap.Employee["dateOfBirth"])
	at com.fasterxml.jackson.databind.ObjectMapper ._convert(ObjectMapper.java:4393)
	at com.fasterxml.jackson.databind.ObjectMapper .convertValue(ObjectMapper.java:4324)
	at com.howtodoinjava.core.objectToMap .ObjectToMapUsingJackson.main(ObjectToMapUsingJackson.java:25)

2.解决方案

我们必须分两步添加对新的Java 8类的支持来解决这个错误。

首先,添加最新版本的com.fasterxml.jackson.datatype:jackson-datatype-jsr310Maven依赖。

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.13.4</version>
</dependency>

第二,根据你使用的模块,用ObjectMapperJsonMapper注册该模块JavaTimeModule

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());

//or 

JsonMapper jsonMapper = new JsonMapper();
jsonMapper.registerModule(new JavaTimeModule());

注册了JavaTimeModule后,上述错误就会消失。