我對Spring Boot和Jetty有一個簡單的應用。我有一個簡單的控制器返回它有一個Java 8 ZonedDateTime
對象:Jackson在Spring Boot中錯誤地序列化了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;
}
我期待根據ISO格式進行格式化ZonedDateTime
,而是我得到了類的全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/
感謝。所以我添加了'jackson-datatype-jsr310'版本2.8.1依賴項,結果是時間戳記更改爲雙「lastUpdated」:1471893818.177000000。在Spring Boot中,我無法直接訪問它正在使用的ObjectMapper,我有什麼想法可以告訴它使用'JavaTimeModule'? (我是一個有點新的春季啓動) – jbx
@jbx檢查這個答案 - http://stackoverflow.com/questions/7854030/configuring-objectmapper-in-spring你也需要嘗試關閉'WRITE_DATES_AS_TIMESTAMPS'功能轉換日期時間以ISO-8601 – vsminkov
只是想告訴你我找到了答案。是的,只需'spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false',不需要以編程方式自定義ObjectMapper。由於我的問題特別是關於Spring引導,你可以編輯你的答案來添加這個,這樣我選擇它作爲正確的答案嗎? – jbx