Formato JSON Java 8 LocalDateTime en Spring Boot

Tengo un pequeño problema al formatear un LocalDateTime de Java 8 en mi Spring Boot Application. Con fechas ‘normales’ no tengo ningún problema, pero los campos LocalDateTime se convierten a los siguientes:

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

Aunque me gustaría convertirlo a algo así como:

 "startDate": "2015-01-01" 

Mi código se ve así:

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

Pero cualquiera de las anotaciones anteriores no funciona, la fecha sigue formateándose como se indica arriba. Sugerencias bienvenidas!

Finalmente encontré aquí cómo hacerlo. Para solucionarlo, necesitaba otra dependencia:

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

Al incluir esta dependencia, Spring registrará automáticamente un convertidor para ella, como se describe aquí . Después de eso, debe agregar lo siguiente a application.properties:

 spring.jackson.serialization.write_dates_as_timestamps=false 

Esto asegurará que se use un convertidor correcto, y las fechas se imprimirán en el formato de 2016-03-16T13:56:39.492

Las anotaciones solo son necesarias en caso de que desee cambiar el formato de fecha.

Agregué la dependencia com.fasterxml.jackson.datatype: jackson-datatype-jsr310: 2.6.1 y comencé a obtener la fecha en el siguiente formato:

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

que no era lo que quería, pero me estaba acercando. Luego agregué el siguiente

 spring.jackson.serialization.write_dates_as_timestamps=false 

al archivo application.properties que me dio el formato correcto que necesitaba.

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

Aquí está en maven, con la propiedad para que pueda sobrevivir entre las actualizaciones de arranque de spring

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

1) Dependencia

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

2) Anotación con formato de fecha y hora.

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

3) Configuración 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; } } 

Encontré otra solución que puede convertirla al formato que desee y aplicar a todo el tipo de datos LocalDateTime y no tiene que especificar @JsonFormat sobre cada tipo de datos LocalDateTime. primero agrega la dependencia:

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

Agregue el siguiente 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() { @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() { @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() { @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() { @Override public void serialize( LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime)); } }); return bean; } } 

en su archivo de configuración agregue lo siguiente:

 @Import(Java8DateTimeConfiguration.class) 

Esto serializará y deserializará todas las propiedades LocalDateTime y ZonedDateTime siempre que use objectMapper creado antes de la spring.

El formato que recibió para ZonedDateTime es: “2017-12-27T08: 55: 17.317 + 02: 00 [Asia / Jerusalem]” para LocalDateTime es: “2017-12-27T09: 05: 30.523”

Esto funciona bien:

Agrega la dependencia:

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

Agrega la anotación:

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

Ahora, debes obtener el formato correcto.

Para usar el asignador de objetos, necesita registrar el JavaTime

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