2014-11-14 12 views
15

Ich versuche, Joda DateTime Eigenschaften als ISO-8601 mit Spring Boot v1.2.0.BUILD-SNAPSHOT serialisieren Hier ist meine sehr einfache REST-Anwendung.Spring Boot Joda DateTime Serialisierung

@RestController 
@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 

    class Info{ 

     private DateTime dateTime; 

     public Info(){ 
      dateTime = new DateTime(); 
     } 
     public DateTime getDateTime() { 
      return dateTime; 
     } 

     public void setDateTime(DateTime dateTime) { 
      this.dateTime = dateTime; 
     } 
    } 

    @RequestMapping("/info") 
    Info info() { 
     return new Info(); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public Module getModule(){ 
     return new JodaModule(); 
    } 
} 

Die DateTime wird als Zeitstempel z. { "Datetime": 1415954873412} Ich habe versucht, das Hinzufügen

@Bean 
    @Primary 
    public ObjectMapper getObjectMapper() { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, 
       false); 
     return objectMapper; 
    } 

aber das hat auch nicht geholfen. Wie konfiguriere ich Jackson in Spring Boot, um das ISO-8601-Format zu serialisieren? BTW: Ich habe nur die folgenden Abhängigkeiten zu meinem gradle

bauen
compile("joda-time:joda-time:2.4") 
compile("org.jadira.usertype:usertype.jodatime:2.0.1") 
compile("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.2"); 

Antwort

4

Pass eine new JodaModule() an den Konstruktor des Objekts Mapper.

Beschriften Sie Ihre Info-Methoden mit dem ISO-Muster

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ") 

oder ich glaube, Sie diese verwenden können, wenn Sie Frühling verwenden

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateTimeFormat.ISO.DATE_TIME) 
+0

können Sie auch .setSimpleDateFormat aufrufen ("yyyy-MM-dd'T'HH: mm: ss.SSSZ"); auf Ihrem Objekt-Mapper, anstatt die Klassen zu kommentieren. – tom

+0

Das einzige, was funktioniert, ist, wenn ich die Anmerkung dh \t \t @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH: mm: ss.SSSZ") verwenden Es muss eine Möglichkeit sein, alle DateTime-Eigenschaften zu aktivieren. Ich möchte nicht alle Eigenschaften notieren müssen – edge66

+0

Nicht sicher, ob es hilft, aber es ist wahrscheinlich ein Upgrade auf 2.4.3, die die neueste Version ist. Außerdem: Wenn '@ JsonFormat' override funktioniert, aber 'SerializationFeature.WRITE_DATES_AS_TIMESTAMPS' nicht, würde ich einen Fehler gegen das Modul einreichen - es sollte so funktionieren, wie Sie es erwarten. – StaxMan

20

Da Sie mit Spring-Boot 1.2 Sie sollten der Lage, die folgenden auf Ihre application.properties Datei einfach hinzufügen:

spring.jackson.serialization.write_dates_as_timestamps=false 

Diese geben ou wird tput in der Form:

{ 
    "dateTime": "2014-11-18T19:01:38.352Z" 
} 

Wenn Sie ein benutzerdefiniertes Format benötigen, können Sie die JodaModule direkt konfigurieren, zum Beispiel des Zeitteil fallen zu lassen:

@Bean 
public JodaModule jacksonJodaModule() { 
    JodaModule module = new JodaModule(); 
    DateTimeFormatterFactory formatterFactory = new DateTimeFormatterFactory(); 
    formatterFactory.setIso(ISO.DATE); 
    module.addSerializer(DateTime.class, new DateTimeSerializer(
     new JacksonJodaFormat(formatterFactory.createDateTimeFormatter() 
      .withZoneUTC()))); 
    return module; 
} 
+1

ich habe bereits versucht, die folgen Sie jedem mit keinem Erfolg 1. Hinzufügen dieser Datei zu der Datei application.properties spring.jackson.serialization.write_dates_as_timestamps = false 2. Erstellen einer Bean wie folgt @Bean public Modul getModule() { \t return new JodaModule(); } 3. Autowiring des ObjectMapper und Einstellung objectMapper.disable (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); Das einzige, was funktioniert, ist die Eigenschaften @JsonFormat (shape = JsonFormat.Shape.STRING, Muster = "JJJJ-MM-TT'T'HH: mm: ss.SSSZ") zu kommentieren) – edge66

+0

Funktioniert für mich. Ich habe meine Probe nach GitHub geschoben https://github.com/philwebb/stackoverflow-26926289 –

+0

Danke dafür - ich habe es zur Arbeit gebracht. Ich benutzte kompilieren ("org.springframework.boot: spring-boot-starter-data-rest") aber es funktioniert mit: kompilieren ("org.springframework.boot: spring-boot-starter-web") Ist das ein Fehler oder eine Funktion? :) – edge66

7

mit Frühlings-Boot-1.2 Sie fließend builder verwenden können für den Aufbau ObjectMapper Beispiel:

@Bean 
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { 
    return builder 
       .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 
       .build(); 
} 

Was JodaModule, wird es automatisch konfiguriert werden, wenn com.fasterxml.jackson.datatype:jackson-datatype-joda ist auf Klassenpfad.

3

Fügen Sie dies zu Ihrem application.* in Ihren Ressourcen hinzu. (Ich benutze Yamel so es .yml für mich ist, sollte aber .properties standardmäßig sein)

spring.jackson.date-format: yyyy-MM-dd'T'HH:mm:ssZ 

oder was auch immer Sie das gewünschte Format.

0

Es gibt auch eine Joda-Datum-Zeit-Format-Eigenschaft (ich denke diese Eigenschaft erschien zum ersten Mal in Spring Boot 1.3.x-Versionen), die Sie in Ihrer Anwendung festlegen können.Eigenschaften, die für jackson Serialisierung/Deserialisierung funktioniert:

Von: Wenn Sie das ISO-Format verwenden möchten, können Sie es wie folgt https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" will be used as a fallback if it is configured with a format string. 

So setzen:

spring.jackson.joda-date-time-format=yyyy-MM-dd'T'HH:mm:ss.SSSZ 

Sie haben können Eine andere Zahl von 'Z', die die Art der Anzeige der Zeitzonen-ID oder der Offset-Stunden ändert, wird in der joda-Zeitdokumentation (http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html) angezeigt:

Zone: 'Z' outputs offset without a colon, 'ZZ' outputs the offset with a colon, 'ZZZ' or more outputs the zone id.