Configurar fechas JSON Jackson en Spring Boot
En este tutorial aprenderemos a configurar la librería Jackson 2.x para el formateo de fechas generadas por la API Date - Time de Java 8 en formato JSON y XML, para soportar esta caracteristica debemos agregar las dependencia jackson-datatype-jsr310, haremos la configuración usando el archivo application.properties y también mediante código Java.
Usaremos la siguiente clase para la demostración:
public class Test {
private LocalDate localDate;
private LocalTime localTime;
private LocalDateTime localDateTime;
public Test() {
this.localDate = LocalDate.now();
this.localTime = LocalTime.now();
this.localDateTime = LocalDateTime.of(2000, Month.JANUARY, 1, 12, 30);
}
// getter y setter ...
}
Para manejar las API de fechas de Java 8 nuestro proyecto Spring Boot requere la siguiente dependencia:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
Las dependencias de la libreria Jackson 2 están incluidas con spring-boot-starter-web.
El controlador es el siguiente:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DateTimeController {
@RequestMapping("/fechas")
public Test fechas() {
return new Test();
}
}
Si ejecutamos nuestra aplicación e ingresamos al navegador debemos ver algo como esto:
{"localDate":[2017,5,12],"localTime":[8,44,13,77000000],"localDateTime":[2000,1,1,12,30]}
Configuarar Jackson desde código
Para hacer esto debemos agregar un bean de tipo ObjectMapper
y marcarlo con la anotación @Primary
, usaremos el objeto Jackson2ObjectMapperBuilder
para construir dicho bean, luego solo debemos configurarlo con las caracteristicas apropiadas a nuestras necesidades, código de ejemplo:
@SpringBootApplication
public class IntroduccionApplication {
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
return objectMapper;
}
public static void main(String[] args) {
SpringApplication.run(IntroduccionApplication.class, args);
}
}
Para generar las fechas en formato ISO debemos desactivar WRITE_DATES_AS_TIMESTAMPS, la caracteristica activada con INDENT_OUTPUT nos permite mostrar la salida JSON en un formato más legible, si visualizamos nuevamente la salida veremos lo siguiente:
{
"localDate" : "2017-05-12",
"localTime" : "08:42:46.505",
"localDateTime" : "2000-01-01T12:30:00"
}
Configurar Jackson desde archivo de properties
Podemos lograr la configuración anterior de una manera más simple y rápida si utilizamos el archivo de configuración src/main/resources/application.properties en el agregamos lo siguiente:
spring.jackson.serialization.INDENT_OUTPUT = true
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
Cada una de las caracteristas configurables que podemos activar o desactivar se corresponden con las propiedades que se muestran en la tabla, del lado izquierdo la enumeración que utilizariamos en código Java y del lado derecho su correspondiente para el archivo de propiedades, debemos reemplazar <feature_name> por la caracteristica deseada.
Jackson enum | Environment property |
com.fasterxml.jackson.databind.DeserializationFeature | spring.jackson.deserialization.<feature_name> |
com.fasterxml.jackson.core.JsonGenerator.Feature | spring.jackson.generator.<feature_name> |
com.fasterxml.jackson.databind.MapperFeature | spring.jackson.mapper.<feature_name> |
com.fasterxml.jackson.core.JsonParser.Feature | spring.jackson.parser.<feature_name> |
com.fasterxml.jackson.databind.SerializationFeature | spring.jackson.serialization.<feature_name> |
Usando @JsonFormat en Spring Boot
Usaremos la anotacion @JsonFormat
para cambiar el formato mediante un patrón establecido por nosotros, esto nos permitirá cambiar el formato individual de cada objeto, ejemplo:
public class Test {
@JsonFormat(pattern = "dd::MM::yyyy")
private LocalDate localDate;
@JsonFormat(pattern = "KK:mm a")
private LocalTime localTime;
@JsonFormat(pattern = "dd::MM::yyyy KK:mm a")
private LocalDateTime localDateTime;
}
Genera la siguiente salida:
{
"localDate" : "12::05::2017",
"localTime" : "09:14 AM",
"localDateTime" : "01::01::2000 00:30 PM"
}
Usando @JsonView en Spring Boot
La anotación @JsonView
nos permite filtrar los objetos que deseamos que sean mapeados a formato JSON, podemos crear una o varias vistas donde cada una puede contener uno o más objetos que serán incluidos en la salida.
public class Test {
public interface Fecha { }
public interface Hora { }
public interface Todo extends Fecha, Hora { }
@JsonView(Fecha.class)
@JsonFormat(pattern = "dd::MM::yyyy")
private LocalDate localDate;
@JsonView(Hora.class)
@JsonFormat(pattern = "KK:mm a")
private LocalTime localTime;
@JsonView(Todo.class)
@JsonFormat(pattern = "dd::MM::yyyy KK:mm a")
private LocalDateTime localDateTime;
}
Este códgo crea tres vistas, la primera incluye solo la fecha, la segunda solo la hora y la tercera inluye la fecha y la hora, es posible anotar un objeto más de una vez con esta anotación, también podemos usar la herencia para agilizar la creación de las vistas.
@RestController
public class DateTimeController {
@JsonView(Test.Fecha.class)
@RequestMapping("/fechas")
public Test fechas() {
return new Test();
}
}
Usando la anotacion sobre el controlador podemos definir cual vista deseamos utilizar, si probamos este ejemplo veremos solo la fecha.
Descargar código: Jackson2 con Spring Boot.zip
Excelentes tutoriales.!!
ResponderEliminar