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

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Detección de figuras geométricas