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