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

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV