2016-08-22 7 views
16

私はSpring BootとJettyで簡単なアプリケーションを持っています。私は単に持っているジャクソンは、SpringブートでZonedDateTimeを間違ってシリアル化します。

RestController
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; 
    } 
} 

@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形式に従ってフォーマットされるように期待していた、私は、Java 8 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を除きます。

なぜ、スプリングブートでジャクソンはこのように動作していますか?

** UPDATE質問をした後、私はこれを見つけたこれを解決する方法をステップガイドにより、フルステップをお探しの方に**

http://lewandowski.io/2016/02/formatting-java-time-with-spring-boot-using-json/

答えて

23

ライブラリjackson-datatype-jsr310があります。それを試してみてください。

このライブラリは新しいdatetime APIをカバーし、ZonedDateTimeのシリアライザも含みます。

必要なのは、ちょうどJavaTimeModuleを追加することです:あなたはWRITE_DATES_AS_TIMESTAMPS機能を無効にする必要がありISO-8601文字列に日時を変換する

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

UPDATE

。あなたは簡単にいずれかのオーバーライドObjectMapper豆またはapplication propertiesを使用して行うことができます。

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false 
+1

感謝を。だから、 'jackson-datatype-jsr310'バージョン2.8.1の依存関係を追加しました。タイムスタンプがダブル" lastUpdated ":1471893818.177000000'に変更されました。 Springのブートでは、 'ObjectMapper'に直接アクセスすることはできません。' JavaTimeModule'を使う場所はどこですか? (私は少し春のブートに新しいです) – jbx

+0

@jbxこの答えを確認する - http://stackoverflow.com/questions/7854030/configuring-objectmapper-in-springまた、あなたはdatetimeを変換するために 'WRITE_DATES_AS_TIMESTAMPS'機能をオフにする必要がありますISO-8601に – vsminkov

+0

答えを見つけました。はい、 'spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false'だけで動作し、' ObjectMapper'をプログラムでカスタマイズする必要はありません。私の質問はSpringブートに関するものなので、答えを編集してこれを追加して正しい答えとして選ぶことができますか? – jbx

関連する問題