【发布时间】:2018-04-06 20:13:42
【问题描述】:
我的实体类中有一个 LocalDateTime 属性,但是当它被序列化时,我看不到预期的格式。
这是课程:
public class MyEntity {
private Integer id;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
private LocalDateTime changeDate;
// getters and setters
}
杰克逊是这样格式化的:
{
"id": 56,
"changeDate": {
"hour":14, "minute":19,
"nano":797000000,
"second":7,
"dayOfMonth":24,
"dayOfWeek":"TUESDAY",
"dayOfYear":297, "month":"OCTOBER",
"monthValue":10,
"year":2017,
"chronology": {
"id":"ISO",
"calendarType":"iso8601"
}
}
}
请注意,我在 pom 中添加了以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
我不包括该版本,因为 Spring Boot 会处理这个问题。 顺便说一句,我使用的是 spring boot 1.5.2.RELEASE。
我还在 application.properties 中包含了以下属性:
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
知道为什么日期的格式不是这样,而是使用我提供的模式吗?
【问题讨论】:
-
如果你使用
spring.jackson.mapper.WRITE_DATES_AS_TIMESTAMPS会发生什么? -
这通常发生在
JavaTimeModule未在ObjectMapper中注册时。我以为spring会自动检测并注册模块,但它似乎没有这样做。 -
不直接相关,但在格式中您附加了文字
Z,实际上是UTC designator。将LocalDateTime视为 UTC 可能是错误的,具体取决于您对它的处理方式。也许将其更改为OffsetDateTime或Instant更准确。 -
正如@Hugo 所说,该模块没有被注册,因此Jackson 只将其视为POJO,使用
LocalDateTime的“getter”对其进行序列化。我不知道 Spring Boot 是否应该自动检测模块(技术上可以通过 SPI 元数据来实现);如果没有找到支持这一点的文档,我不会指望这一点。 -
WRITE_DATES_AS_TIMESTAMPS = false尝试删除空格
标签: java spring-boot java-8 jackson