2015-04-29 17 views
60

Ho un piccolo problema con la formattazione di Java 8 LocalDateTime nella mia applicazione di avvio a molla. Con 'normali' date non ho alcun problema, ma i campi LocalDateTime vengono convertiti i seguenti:JSON Java 8 Formato LocalDateTime in Spring Boot

"startDate" : { 
    "year" : 2010, 
    "month" : "JANUARY", 
    "dayOfMonth" : 1, 
    "dayOfWeek" : "FRIDAY", 
    "dayOfYear" : 1, 
    "monthValue" : 1, 
    "hour" : 2, 
    "minute" : 2, 
    "second" : 0, 
    "nano" : 0, 
    "chronology" : { 
     "id" : "ISO", 
     "calendarType" : "iso8601" 
    } 
    } 

Mentre vorrei convertirlo in qualcosa di simile a:

"startDate": "2015-01-01" 

Il mio codice è simile al seguente:

@JsonFormat(pattern="yyyy-MM-dd") 
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME) 
public LocalDateTime getStartDate() { 
    return startDate; 
} 

Ma una delle annotazioni precedenti non funziona, la data continua a essere formattata come sopra. Suggerimenti benvenuto!

risposta

84

Ho finalmente trovato here come farlo. Per risolvere il problema, avevo bisogno di un'altra dipendenza:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0") 

Includendo questa dipendenza, Primavera registrerà automaticamente un convertitore per esso, come descritto here. Dopo di che, è necessario aggiungere la seguente al application.properties:

spring.jackson.serialization.write_dates_as_timestamps=false 

Questo farà sì che un convertitore corretto viene utilizzato, e le date verranno stampati nel formato 2016-03-16T13:56:39.492

NOTE solo sono necessarie in caso si desidera modificare il formato della data.

+10

Probabilmente vale la seguente annotazione - '@JsonSerialize (using = LocalDateTimeSerializer.class)' ... –

+1

Probabilmente è meglio usare semplicemente una voce 'application.properties', come suggerito da @patelb answer. – membersound

+0

Non funziona. Ma la risposta di patelib funziona appena fuori dagli schemi! –

64

ho aggiunto il com.fasterxml.jackson.datatype: jackson-tipo di dato-jsr310: 2.6.1 dipendenza e ho iniziato a ottenere la data nel seguente formato:

"birthDate": [ 
    2016, 
    1, 
    25, 
    21, 
    34, 
    55 
    ] 

che non ciò che è Volevo ma mi stavo avvicinando. Ho quindi aggiunto il seguente

spring.jackson.serialization.write_dates_as_timestamps=false 

al file application.properties che mi ha fornito il formato corretto di cui avevo bisogno.

"birthDate": "2016-01-25T21:34:55" 
+1

Funzionalità out of the box quando si include la dipendenza 'jackson-datatype-jsr310'. Questa dovrebbe essere la risposta accettata. – membersound

+3

Come una cronaca, la parte application.properties può essere fatto attraverso Java config se si sta configurando l'ObjectMapper con: 'mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);' – justin

20

Qui è in Maven, con la proprietà in modo da poter sopravvivere tra la primavera aggiornamenti di avvio

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

1) Dipendenza

compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.8' 

2) Annotazione con il formato data-ora.

public class RestObject { 

    private LocalDateTime timestamp; 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    public LocalDateTime getTimestamp() { 
     return timestamp; 
    } 
} 

3) Spring Config.

@Configuration 
public class JacksonConfig { 

    @Bean 
    @Primary 
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { 
     System.out.println("Config is starting."); 
     ObjectMapper objectMapper = builder.createXmlMapper(false).build(); 
     objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
     return objectMapper; 
    } 
} 
1

ho trovato un'altra soluzione che si applicano a tutti i tipo di dati LocalDateTime e non si deve specificare @JsonFormat di sopra di ogni tipo di dati LocalDateTime. prima aggiungere la dipendenza:

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

aggiungere i seguenti bean:

@Configuration 
public class Java8DateTimeConfiguration { 
    /** 
    * Customizing 
    * http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html 
    * 
    * Defining a @Bean of type Jackson2ObjectMapperBuilder will allow you to customize both default ObjectMapper and XmlMapper (used in MappingJackson2HttpMessageConverter and MappingJackson2XmlHttpMessageConverter respectively). 
    */ 
    @Bean 
    public Module jsonMapperJava8DateTimeModule() { 
     val bean = new SimpleModule(); 

     bean.addDeserializer (ZonedDateTime.class, new JsonDeserializer<ZonedDateTime>() { 
      @Override 
      public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
       return ZonedDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_ZONED_DATE_TIME); 
      } 
     }); 

     bean.addDeserializer(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() { 
      @Override 
      public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
       return LocalDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME); 
      } 
     }); 

     bean.addSerializer(ZonedDateTime.class, new JsonSerializer<ZonedDateTime>() { 
      @Override 
      public void serialize(
        ZonedDateTime zonedDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
        throws IOException { 
       jsonGenerator.writeString(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime)); 
      } 
     }); 

     bean.addSerializer(LocalDateTime.class, new JsonSerializer<LocalDateTime>() { 
      @Override 
      public void serialize(
        LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
        throws IOException { 
       jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime)); 
      } 
     }); 

     return bean; 
    } 
} 

nel file di configurazione aggiungere quanto segue:

@Import(Java8DateTimeConfiguration.class) 

Ciò serializzare e de-serializzare tutte le proprietà LocalDateTime e ZonedDateTime fino a quando si utilizza objectMapper creato da spring.

Il formato che avete ottenuto per ZonedDateTime è: "2017-12-27T08: 55: 17,317 + 02: 00 [Asia/Gerusalemme]" per LocalDateTime è: "2017-12-27T09: 05: 30,523"

+0

probabaly è necessario sostituire fagioli \t val di SimpleModule bean = new SimpleModule(); – Abhi