2016-08-22 52 views
16

'da bir ZonedDateTime'ı hatalı bir şekilde serileştirdi. Basit bir kontrolör bir Java 8 ZonedDateTime sahip bir nesne dönen vardır:Jackson, Spring Boot

Benim RestController yılında
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; 
    } 
} 

ben sadece var:

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

Ben ISO formatına göre biçimlendirilmiş olması ZonedDateTime bekliyordum, ama onun yerine ben böyle sınıfın bütün bir JSON dökümü alıyorum:

"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", ... 

sadece spring-boot-starter-web uygulama var spring-boot-starter-jetty kullanarak ve spring-boot-starter-tomcat hariç.

Jackson neden Spring Boot'da böyle davranıyor?

** GÜNCELLEME soruyu soran sonra bunu buldum bu çözmek için nasıl adım kılavuz tam bir adım arayanlar için **

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

cevap

23

kütüphane jackson-datatype-jsr310 yoktur. Dene.

Bu kitaplık yeni datetime API'sini kapsar ve ZonedDateTime için seri hale getiriciler içerir.

Tüm ihtiyacınız sadece JavaTimeModule eklemektir: Eğer WRITE_DATES_AS_TIMESTAMPS özelliğini devre dışı bırakmalısınız ISO-8601 dizeye datetime dönüştürmek için

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

GÜNCELLEME

. Kolayca ya basan ObjectMapper fasulye veya application properties kullanarak yapabilirsiniz:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false 
+1

teşekkür ederiz. Bu yüzden, 'jackson-datatype-jsr310' sürüm 2.8.1 bağımlılığını ekledim ve efekt, zaman damgasının iki kez "lastUpdated" olarak değiştirildi: 1471893818.177000000'. Spring Boot'da, kullandığım 'ObjectMapper''a doğrudan erişimim yok, herhangi bir fikri 'JavaTimeModule' 'ı kullanmayı nereden söyleyebilirim? (Ben Spring Boot için biraz yeniyim) – jbx

+0

@jbx bu cevabı kontrol et - http://stackoverflow.com/questions/7854030/configuring-objectmapper-in-spring datetime dönüştürmek için 'WRITE_DATES_AS_TIMESTAMPS' özelliğini kapatmayı denemeniz gerekiyor ISO 8601 – vsminkov

+0

Sadece cevabı bulduğumu söyleyecektim. Evet, sadece "spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false" ile çalışır, "ObjectMapper" öğesini programsal olarak özelleştirmeye gerek yoktur. Sorum, özellikle Spring boot ile ilgili olduğundan, cevabınızı, bunu doğru yanıt olarak seçmemi sağlayacak şekilde eklemek için düzenleyebilir misiniz? – jbx

İlgili konular