Format JSON Java 8 LocalDateTime dans Spring Boot

J’ai un petit problème avec le formatage de Java 8 LocalDateTime dans mon application Spring Boot. Avec des dates ‘normales’, je n’ai aucun problème, mais les champs LocalDateTime sont convertis comme suit:

"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" } } 

Alors que je voudrais le convertir en quelque chose comme:

 "startDate": "2015-01-01" 

Mon code ressemble à ceci:

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

Mais l’une des annotations ci-dessus ne fonctionne pas, la date continue à être formatée comme ci-dessus. Suggestions bienvenue!

J’ai finalement trouvé ici comment le faire. Pour y remédier, j’avais besoin d’une autre dépendance:

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

En incluant cette dépendance, Spring enregistre automatiquement un convertisseur, comme décrit ici . Après cela, vous devez append les éléments suivants à application.properties:

 spring.jackson.serialization.write_dates_as_timestamps=false 

Cela garantira qu’un convertisseur correct est utilisé et les dates seront imprimées dans le format du 2016-03-16T13:56:39.492

Les annotations ne sont nécessaires que si vous souhaitez modifier le format de date.

J’ai ajouté la dépendance com.fasterxml.jackson.datatype: jackson-datatype-jsr310: 2.6.1 et j’ai commencé à obtenir la date au format suivant:

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

ce qui n’est pas ce que je voulais mais je me rapprochais. J’ai ensuite ajouté ce qui suit

 spring.jackson.serialization.write_dates_as_timestamps=false 

au fichier application.properties qui m’a donné le format correct dont j’avais besoin.

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

Ici, il est dans maven, avec la propriété de sorte que vous pouvez survivre entre les mises à niveau de démarrage de spring

  com.fasterxml.jackson.datatype jackson-datatype-jsr310 ${jackson.version}  

1) dépendance

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

2) Annotation au format date-heure.

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

3) Config de spring.

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

J’ai trouvé une autre solution que vous pouvez convertir dans le format de votre choix et qui s’applique à tous les types de données LocalDateTime et vous n’avez pas à spécifier @JsonFormat au-dessus de chaque type de données LocalDateTime. ajoutez d’abord la dépendance:

  com.fasterxml.jackson.datatype jackson-datatype-jsr310  

Ajoutez le haricot suivant:

 @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() { @Override public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { return ZonedDateTime.parse(jsonParser.getValueAsSsortingng(), DateTimeFormatter.ISO_ZONED_DATE_TIME); } }); bean.addDeserializer(LocalDateTime.class, new JsonDeserializer() { @Override public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { return LocalDateTime.parse(jsonParser.getValueAsSsortingng(), DateTimeFormatter.ISO_LOCAL_DATE_TIME); } }); bean.addSerializer(ZonedDateTime.class, new JsonSerializer() { @Override public void serialize( ZonedDateTime zonedDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeSsortingng(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime)); } }); bean.addSerializer(LocalDateTime.class, new JsonSerializer() { @Override public void serialize( LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeSsortingng(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime)); } }); return bean; } } 

dans votre fichier de configuration, ajoutez ce qui suit:

 @Import(Java8DateTimeConfiguration.class) 

Cela va sérialiser et désérialiser toutes les propriétés LocalDateTime et ZonedDateTime tant que vous utilisez objectMapper créé par Spring.

Le format que vous avez obtenu pour ZonedDateTime est: “2017-12-27T08: 55: 17.317 + 02: 00 [Asia / Jerusalem]” pour LocalDateTime est: “2017-12-27T09: 05: 30.523”

Ce travail fonctionne bien:

Ajoutez la dépendance:

  com.fasterxml.jackson.datatype jackson-datatype-jdk8  

Ajouter l’annotation:

 @JsonFormat(pattern="yyyy-MM-dd") 

Maintenant, vous devez obtenir le bon format.

Pour utiliser object mapper, vous devez enregistrer le JavaTime

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