2015-07-25 27 views
8

Mam problem z serializacją json z ZonedDateTime. Po przekonwertowaniu do json generuje ogromny obiekt i nie chcę, aby wszystkie dane były przesyłane za każdym razem. Więc próbowałem sformatować go do ISO, ale to nie działa. Jak mogę go sformatować?Spring Data JPA - format ZonedDateTime do serializacji json

Oto moja Entity Class:

@MappedSuperclass 
public abstract class AuditBase { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @CreatedDate 
    private ZonedDateTime createdDate; 

    @LastModifiedDate 
    private ZonedDateTime lastModifiedDate; 

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
    public ZonedDateTime getLastModifiedDate() { 
     return lastModifiedDate; 
    } 

    public void setLastModifiedDate(ZonedDateTime lastModifiedDate) { 
     this.lastModifiedDate = lastModifiedDate; 
    } 

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
    public ZonedDateTime getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(ZonedDateTime createdDate) { 
     this.createdDate = createdDate; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @PrePersist 
    public void prePersist() { 
     this.createdDate = ZonedDateTime.now(); 
     this.lastModifiedDate = ZonedDateTime.now(); 
    } 

    @PreUpdate 
    public void preUpdate() { 
     this.lastModifiedDate = ZonedDateTime.now(); 
    } 
} 

Odpowiedz

17

Chyba, że ​​używasz Jacksona do serializacji json, Jackson ma teraz moduł do nowego API Javy 8 czasu data, https://github.com/FasterXML/jackson-datatype-jsr310.

Dodaj tę zależność do swojego pom.xml

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr310</artifactId> 
    <version>2.6.0</version> 
</dependency> 

I to jest jego użycie:

public static void main(String[] args) throws JsonProcessingException { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(new JavaTimeModule()); 
    System.out.println(objectMapper.writeValueAsString(new Entity())); 
} 

static class Entity { 
    ZonedDateTime time = ZonedDateTime.now(); 

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
    public ZonedDateTime getTime() { 
     return time; 
    } 
} 

Wyjście jest:

{"time":"2015-07-25T23:09:01.795+0700"} 

Uwaga: Jeśli wersja Jackson 2.4.x użycie

objectMapper.registerModule(new JSR310Module()); 

Mam nadzieję, że to pomoże!

+0

miałem coś bardzo dziwnego: {"time": 1473923145.038000000}. Dzięki Twojemu rozwiązaniu mam teraz {"czas": "2016-09-15T07: 57: 26.602 + 0000"} zgodnie z życzeniem. –

+0

Dla mnie wystarczyło z registerModule. Nie musiałem dotykać istoty. Dzięki!! –

+0

Zawsze dostaję dreszcze, gdy ktoś opublikuje 5 linii XML z pliku pom, Gralde dla wygranej;) –

2

Przede prac odpowiedzi, ale jeśli nie chce się dotknąć istniejącą klasę podmiotu następujące ustawienia będą działać z ZonedDateTime:

public static ObjectMapper getMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(new JavaTimeModule());  
    return mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false) 
.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,false) 
         .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false) 
         .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) 
         .setVisibility(mapper.getSerializationConfig() 
           .getDefaultVisibilityChecker() 
           .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
           .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
           .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
           .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 
    } 

Biblioteka:

<dependency> 
      <groupId>com.fasterxml.jackson.dataformat</groupId> 
      <artifactId>jackson-dataformat-csv</artifactId> 
      <version>${jackson.dataformat.csv.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.datatype</groupId> 
      <artifactId>jackson-datatype-jsr310</artifactId> 
     </dependency>