【发布时间】:2021-02-09 18:29:22
【问题描述】:
我正在使用 spring boot 2.3.4.RELEASE,当尝试将包含 Instant 属性的 DTO 转换为 JSON 格式时,jackson ObjectMapper 不断将其转换为时间戳格式,即使打开了 write-dates-as-timestamps 选项关闭。
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
....
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
application.properties
spring.jackson.serialization.write-dates-as-timestamps = false
DTO:
@Data
public class MyDTO {
Long id;
@NotNull
String number;
@NotNull
Integer year;
@NotNull
VesselContractStatusEnum status;
Instant statusDate;
}
休息控制器响应:
{
"id": 1,
"number": "202000",
"year": 2020,
"status": "Open",
"statusDate": 1602298800
}
按照 StackOverflow 中的建议,我尝试使用以下方法覆盖 ObjectMapper,但没有成功。
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.build();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
JavaTimeModule javaTimeModule = new JavaTimeModule();
objectMapper.registerModule(javaTimeModule);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
return objectMapper;
}
【问题讨论】:
-
禁用
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS就足够了,但可以通过提供全局Jackson属性来做到这一点。看看Customize the Jackson ObjectMapper。WRITE_DATES_AS_TIMESTAMPS应该默认禁用,但您需要在您的应用程序中检查它。如果JavaTimeModule在类路径上,Jackson2ObjectMapperBuilder应该可以找到并识别它,您不必手动注册。
标签: java spring spring-boot jackson spring-restcontroller