Formatando datas JSON na inicialização do Spring

Formatando datas JSON na inicialização do Spring

1. Visão geral

Neste tutorial, mostraremos como formatar os campos de data JSON em um aplicativo Spring Boot.

Vamos explorar várias maneiras de formatar datas usando https://www..com/jackson [ Jackson ], que é usado pelo Spring Boot como seu processador JSON padrão.

* 2.. *Usando _ @ JsonFormat_ em um campo Date

====* 2.1 Definindo o formato *

*Podemos usar a anotação https://www..com/jackson-jsonformat [_ @ JsonFormat_] para formatar um campo específico __: __*
public class Contact {

   //other fields

    @JsonFormat(pattern="yyyy-MM-dd")
    private LocalDate birthday;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastUpdate;

   //standard getters and setters

}

No campo birthday, usamos um padrão que renderiza apenas a data, enquanto no campo lastUpdate também incluímos a hora.

Usamos os https://www..com/java-8-date-time-intro [ tipos de data Java 8 ], que são bastante úteis para lidar com tipos temporais. Obviamente, se precisarmos usar os tipos herdados como _java.util.Date, _, podemos usar a anotação da mesma maneira:

public class ContactWithJavaUtilDate {

    //other fields

     @JsonFormat(pattern="yyyy-MM-dd")
     private Date birthday;

     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private Date lastUpdate;

    //standard getters and setters
}

Por fim, vamos dar uma olhada na saída renderizada usando o @ JsonFormat com o formato de data fornecido:

{
    "birthday": "2019-02-03",
    "lastUpdate": "2019-02-03 10:08:02"
}
*Como podemos ver, usar a anotação __ @ JsonFormat __ é uma excelente maneira de formatar um campo de data específico.*
*No entanto, só devemos usá-lo quando precisarmos de formatação específica para os campos.* Se quisermos ter um formato geral para todas as datas em nosso aplicativo, há maneiras melhores de conseguir isso, como veremos mais adiante.

2.2 Definir o fuso horário

Além disso, se precisarmos usar um fuso horário específico, podemos definir o atributo timezone do @_JsonFormat: _

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;

Não precisamos usá-lo se um tipo já contiver o fuso horário, por exemplo, com java.time.ZonedDatetime.

*3. Configurando o formato padrão *

E, embora _ @ JsonFormat_ seja poderoso por si só, codificar o formato e o fuso horário podem nos levar adiante.

Se queremos configurar um formato padrão para todas as datas em nosso aplicativo,* uma maneira mais flexível é configurá-lo em application.properties *:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

E se queremos usar um fuso horário específico em nossas datas JSON, também há uma propriedade para isso:

spring.jackson.time-zone=Europe/Zagreb

Embora definir o formato padrão como esse seja bastante útil e direto, há uma desvantagem nessa abordagem. Infelizmente, ele não funciona com os tipos de data do Java 8 , como LocalDate e LocalDateTime - , podemos usá-lo apenas para formatar campos do tipo java.util.Date ou java.util.Calendar. Há esperança, porém, como veremos em breve.

*4. Personalizando o ObjectMapper de Jackson *

Portanto, se quisermos usar os tipos de datas Java 8 e definir um formato de data padrão, precisamos examinar* criando um Jackson2ObjectMapperBuilderCustomizer bean: *

@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)));
        };
    }

}

O exemplo acima mostra como configurar um formato padrão em nosso aplicativo. Temos que definir um bean e substituir seu método customize para definir o formato desejado.

Embora essa abordagem possa parecer um pouco complicada, o mais interessante é que ela funciona para os tipos de data Java 8 e legado.

===* 5. Conclusão*

Neste artigo, exploramos várias maneiras diferentes de formatar datas JSON em um aplicativo Spring Boot.

Como sempre, podemos encontrar o código fonte dos exemplos em GitHub.