我有一个带有 Spring Boot 和 Jetty 的简单应用程序。我有一个简单的控制器返回一个对象,它有一个 Java 8 ZonedDateTime
:
public class Device {
// ...
private ZonedDateTime lastUpdated;
public Device(String id, ZonedDateTime lastUpdated, int course, double latitude, double longitude) {
// ...
this.lastUpdated = lastUpdated;
// ...
}
public ZonedDateTime getLastUpdated() {
return lastUpdated;
}
}
在我的 RestController
我只是有:
@RequestMapping("/devices/")
public @ResponseBody List<Device> index() {
List<Device> devices = new ArrayList<>();
devices.add(new Device("321421521", ZonedDateTime.now(), 0, 39.89011333, 24.438176666));
return devices;
}
我原以为 ZonedDateTime
会根据 ISO 格式进行格式化,但我却得到了类的整个 JSON 转储,如下所示:
"lastUpdated":{"offset":{"totalSeconds":7200,"id":"+02:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"zone":{"id":"Europe/Berlin","rules":{"fixedOffset":false,"transitionRules":[{"month":"MARCH","timeDefinition":"UTC","standardOffset":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetBefore":{"totalSeconds":3600,"id":"+01:00","rules":{"fixedOffset":true,"transitionRules":[],"transitions":[]}},"offsetAfter":{"totalSeconds":7200,"id":"+02:00", ...
我只有一个 spring-boot-starter-web
应用程序,使用 spring-boot-starter-jetty
并排除 spring-boot-starter-tomcat
。
为什么杰克逊在 Spring Boot 中表现如此?
\*\* 更新 **
对于那些正在寻找如何解决这个问题的完整分步指南的人,我在提出问题后发现了这一点:http: //lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/
原文由 jbx 发布,翻译遵循 CC BY-SA 4.0 许可协议
有一个库 jackson-datatype-jsr310 。试试看。
该库涵盖了新的日期时间 API,还包括
ZonedDateTime
的序列化程序。您只需要添加
JavaTimeModule
:更新
要将日期时间转换为
ISO-8601
字符串,您应该禁用WRITE_DATES_AS_TIMESTAMPS
功能。您可以通过覆盖ObjectMapper
bean 或使用 应用程序属性 轻松地做到这一点: