2016-08-22 122 views
16

我對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/

回答

23

設有一個圖書館jackson-datatype-jsr310。嘗試一下。

這個庫覆蓋了新的日期時間API,並且還包含ZonedDateTime的序列化器。

所有你需要的只是添加JavaTimeModule

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JavaTimeModule()); 

UPDATE

爲DateTime轉換爲字符串ISO-8601你應該禁用WRITE_DATES_AS_TIMESTAMPS功能。您可以輕鬆地,通過重寫ObjectMapper豆或使用application properties做:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false 
+1

感謝。所以我添加了'jackson-datatype-jsr310'版本2.8.1依賴項,結果是時間戳記更改爲雙「lastUpdated」:1471893818.177000000。在Spring Boot中,我無法直接訪問它正在使用的ObjectMapper,我有什麼想法可以告訴它使用'JavaTimeModule'? (我是一個有點新的春季啓動) – jbx

+0

@jbx檢查這個答案 - http://stackoverflow.com/questions/7854030/configuring-objectmapper-in-spring你也需要嘗試關閉'WRITE_DATES_AS_TIMESTAMPS'功能轉換日期時間以ISO-8601 – vsminkov

+0

只是想告訴你我找到了答案。是的,只需'spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false',不需要以編程方式自定義ObjectMapper。由於我的問題特別是關於Spring引導,你可以編輯你的答案來添加這個,這樣我選擇它作爲正確的答案嗎? – jbx

相關問題