2014-11-14 22 views
15

Sto provando a serializzare le proprietà Joda DateTime come ISO-8601 utilizzando Spring Boot v1.2.0.BUILD-SNAPSHOT Ecco la mia applicazione REST molto semplice.avvio a molla Joda DateTime Serialization

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

La data ora viene serializzata come un timestamp, ad es. { "DateTime": 1415954873412} Ho provato ad aggiungere

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

ma che non ha aiutato neanche. Quindi, come posso configurare Jackson in Spring Boot per la serializzazione utilizzando il formato ISO-8601? BTW: ho solo aggiunto le seguenti dipendenze al mio Gradle costruire

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"); 

risposta

4

Passare un new JodaModule() al costruttore del vostro mapper oggetto.

Annotare i vostri metodi Info con il modello ISO

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

o Penso che si possa utilizzare questo se si sta utilizzando la primavera

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

puoi anche chiamare .setSimpleDateFormat ("aaaa-MM-gg'T'HH: mm: ss.SSSZ"); sul tuo object mapper invece di annotare le classi. – tom

+0

L'unica cosa che funziona è che se io uso l'esempio di annotazione \t \t @JsonFormat (forma = JsonFormat.Shape.STRING, modello = "AAAA-MM-dd'T'HH: mm: ss.SSSZ") Ci deve essere un modo per abilitare tutte le proprietà DateTime. Non voglio dover annotare tutte le proprietà – edge66

+0

Non sono sicuro che sia d'aiuto, ma probabilmente vale la pena passare alla versione 2.4.3, che è l'ultima versione. Inoltre: se la funzione di sovrascrittura '@ JsonFormat' funziona, ma non si utilizza SerializationFeature.WRITE_DATES_AS_TIMESTAMPS', dovrei presentare un bug al modulo - dovrebbe funzionare come previsto. – StaxMan

20

Dal momento che si sta utilizzando Primavera Boot 1.2 si dovrebbe essere in grado di aggiungere semplicemente quanto segue al file di application.properties:

spring.jackson.serialization.write_dates_as_timestamps=false 

Questo darà ou tput nella forma:

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

Se avete bisogno di un formato personalizzato è possibile configurare le JodaModule direttamente, ad esempio, far cadere il parziale:

@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

Ho già provato il seguire ciascuno senza esito positivo 1. Aggiungerlo al file application.properties spring.jackson.serialization.write_dates_as_timestamps = false 2. Creazione di un bean nel modo seguente @Bean public module getModule() { \t return new JodaModule(); } 3. Autowiring di ObjectMapper e impostazione objectMapper.disable (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); L'unica cosa che funziona è annotare le proprietà @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH: mm: ss.SSSZ") – edge66

+0

Funziona per me. Ho spinto il mio campione su GitHub https://github.com/philwebb/stackoverflow-26926289 –

+0

Grazie per quello, l'ho fatto funzionare. Stavo usando compilare ("org.springframework.boot: spring-boot-starter-data-resto") ma funziona con: compile ("org.springframework.boot: spring-boot-starter-web") È un bug o una funzionalità? :) – edge66

7

Con Primavera Boot 1.2 è possibile utilizzare un fluente builder per costruire ObjectMapper esempio:

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

quanto JodaModule, verrà configurato automaticamente quando è com.fasterxml.jackson.datatype:jackson-datatype-joda sul classpath.

3

Aggiungi questo al tuo application.* nelle tue risorse. (Io uso Yamel quindi è .yml per me, ma dovrebbe essere .properties per default)

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

o qualsiasi altro formato che si desidera.

0

Esiste anche una proprietà di formato joda-data-time (penso che questa proprietà sia apparsa per la prima volta nelle versioni di avvio 1.3.x di Spring) che è possibile impostare nell'applicazione.proprietà che funzioneranno per Jackson serializzazione/deserializzazione:

Da: 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. 

Quindi, se si desidera utilizzare il formato ISO è possibile impostare in questo modo:

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

si può avere numero diverso di "Z" che cambia il modo in cui vengono visualizzate l'id del fuso orario o le ore di offset dalla documentazione del tempo di joda (http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html):

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