学习如何在使用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>
第二,根据你使用的模块,用ObjectMapper或JsonMapper注册该模块JavaTimeModule 。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
//or
JsonMapper jsonMapper = new JsonMapper();
jsonMapper.registerModule(new JavaTimeModule());
注册了JavaTimeModule后,上述错误就会消失。