文
章
目
录
章
目
录
Jackson – Java 8日期/时间类型java.time.LocalDate
默认不受支持。尝试使用Jackson将包含Java 8时间API(如LocalDate)的对象转换为JSON格式的字符串时遇到错误,即:“ Java 8 date/time type `java.time.LocalDate` not supported by default”。
比如如下示例:
import java.math.BigDecimal;
import java.time.LocalDate;
public class Book {
private Long id;
private String title;
private BigDecimal price;
// Java 8 only
private LocalDate publishDate;
//...
}
App.java:
ObjectMapper om = new ObjectMapper();
Book book =
new Book(1L, "Book A",
BigDecimal.valueOf(9.99),
LocalDate.of(2023, 10, 1));
// 将对象转为 json
String result = om.writeValueAsString(book);
运行抛出异常如下:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
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.mkyong.json.model.Book["publishDate"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
......
解决办法,使用jackson-datatype-jsr310
Jackson默认不支持Java 8日期时间APIs;我们需要手动添加依赖项jackson-datatype-jsr310并注册JavaTimeModule()以使Jackson支持Java 8日期时间APIs。
pom.xml:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- 支持"Java 8 Dates" -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
代码实现:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
ObjectMapper om = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
// 将对象转为 json
String result = om.writeValueAsString(book);
或者使用这样的代码实现:
ObjectMapper om = new ObjectMapper();
om.findAndRegisterModules();
以上就是Jackson不支持Java 8日期/时间类型LocalDate的解决办法。