Formato de fechas JSON en Spring Boot
Uno de los problemas más frecuentes que nos encontramos cuando trabajamos con fechas son los diferentes formatos que llegan en un JSON. Por lo que en esta entrada sobre formato de fechas JSON en Spring Boot vamos a ver cómo podemos establecer un formato según se necesite.
Si lo que necesitas es realizar una conversión de String a Fechas puedes echar un ojo aquí.
Configurando el ObjectMapper
Si queremos definir un formato de fecha por defecto para toda nuestra aplicación podemos hacer uso de la clase org.springframework.http.converter.json.Jackson2ObjectMapperBuilder con la que creamos un bean para hacer uso en toda la aplicación. El punto positivo de esta aproximación es que podemos hacer uso de los tipos de fecha java.time.*
@Configuration public class ContactAppConfig { private static final String dateFormat = "yyyy-MM-dd"; private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { builder.simpleDateFormat(dateTimeFormat); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); }; } }Copy
Uso de @JsonFormat para establecer un formato de fecha
Una de las aproximaciones más usadas para establecer un formato por defecto de fecha en nuestras aplicaciones Spring Boot es hacer uso de la anotación @JsonFormat.
La anotación @JsonFormat es una anotación Jackson que usamos para especificar el formato o alguna propiedad que viene de un JSON, por ejemplo cuando llega una petición post de un controller poder dar formato para nuestro DTO a los campos de ese JSON de entrada.
@JsonFormat nos permite trabajar sin ningún problema con los tipos de fecha de Java 8 java.time.*.
@Getter @Setter public class User { private Long id; private String name; @JsonFormat(pattern="yyyy-MM-dd") private LocalDate birth; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime createDate; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime updateDate; }
El especificar un formato de fechas JSON con Spring Boot aplicando la aproximación con @JsonFormat nos permite su utilización con la clase java.util.Date:
@Getter @Setter public class User { private Long id; private String name; @JsonFormat(pattern="yyyy-MM-dd") private Date birth; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createDate; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateDate; }
Además si estas utilizando fechas en las que necesitamos indicar la zona podemos indicarlo en el JsonFormat:
@Getter @Setter public class User { private Long id; private String name; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="Europe/Berlin") private Date birth; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="Europe/Berlin") private Date createDate; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="Europe/Berlin") private Date updateDate; }
Esta aproximación nos permite personalizar cada campo de forma independiente de manera que podemos aislar ese campo con ese formato.
Estableciendo formato de fechas por defecto en Spring Boot
Para aquellos casos en los que no hagamos uso de las fechas que fueron introducidas en Java 8 (java.time.*), podemos establecer un formato por defecto a través de nuestro fichero de propiedades. (application.yml o application.properties).
Esta aproximación permite eliminar el boilerplate o la configuración adicional de crear un bean para el objectmapper.
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
También podemos especificar la zona de la siguiente manera
spring.jackson.time-zone=Europe/Berlin
Hay que tener en cuenta que el formato de fechas por propiedades en Spring Boot NO funciona para el paquete java.time
Conclusión para formato de fechas JSON en Spring Boot
En esta entrada hemos visto como podemos realizar transformaciones de fecha desde un JSON a objetos de tipo fecha en Java (Date, LocalDate, LocalDateTime etc…). Para aplicar un formato de fechas JSON con Spring Boot habrá que ver las posibilidades que tenemos, en función de si se lo queremos aplicar a un campo solo, a todos los tipos fecha o si nuestras fechas son Java.time o Java.Util.Date.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!
Gracias ahora he conseguido que me funcione para fechas java.time