Trabalhando com parâmetros de data no Spring
1. Introdução
Neste breve tutorial, daremos uma olhada em como aceitar os parâmetrosDate,LocalDateeLocalDateTime em solicitações Spring REST, tanto nos níveis de solicitação quanto de aplicativo.
2. O problema
Vamos considerar um controlador com três métodos que aceitam os parâmetrosDate,LocalDateeLocalDateTime:
@RestController
public class DateTimeController {
@PostMapping("/date")
public void date(@RequestParam("date") Date date) {
// ...
}
@PostMapping("/localdate")
public void localDate(@RequestParam("localDate") LocalDate localDate) {
// ...
}
@PostMapping("/localdatetime")
public void dateTime(@RequestParam("localDateTime") LocalDateTime localDateTime) {
// ...
}
}
Ao enviar uma solicitação POST para qualquer um desses métodos com um parâmetro formatado de acordo com ISO 8601, obteremos uma exceção.
Por exemplo, ao enviar “2018-10-22” para o endpoint/date, obteremos um erro de solicitação incorreta com uma mensagem semelhante a esta:
Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate';
nested exception is org.springframework.core.convert.ConversionFailedException.
Isso ocorre porque o Spring, por padrão, não pode converter parâmetros de String em nenhum objeto de data ou hora.
3. Converter parâmetros de data no nível de solicitação
Uma das maneiras de lidar com esse problema é anotar os parâmetros com a anotação@DateTimeFormat e fornecer um parâmetro de padrão de formatação:
@RestController
public class DateTimeController {
@PostMapping("/date")
public void date(@RequestParam("date")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {
// ...
}
@PostMapping("/local-date")
public void localDate(@RequestParam("localDate")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
// ...
}
@PostMapping("/local-date-time")
public void dateTime(@RequestParam("localDateTime")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
// ...
}
}
Dessa forma, as Strings serão convertidas adequadamente em objetos de data, desde que as Strings sejam formatadas usando o formato ISO 8601.
Também podemos usar nossos próprios padrões de conversão. Podemos apenas fornecer um parâmetro padrão na anotação@DateTimeFormat:
@PostMapping("/date")
public void date(@RequestParam("date")
@DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
// ...
}
4. Converter parâmetros de data no nível do aplicativo
Outra maneira de lidar com a conversão de objetos de data e hora no Spring é fornecer uma configuração global. Podemos fazer isso seguindothe official documentation:
@Configuration
class DateTimeConfig {
@Bean
public FormattingConversionService conversionService() {
DefaultFormattingConversionService conversionService =
new DefaultFormattingConversionService(false);
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
registrar.registerFormatters(conversionService);
// other desired formatters
return conversionService;
}
}
Primeiro, criamosDefaultFormattingConversionService com um parâmetro falso, o que significa que o Spring não registrará nenhum formatador por padrão.
E então, registramos manualmente novos padrões para formatos de data e hora no objetoDateTimeFormatterRegistrar.
5. Sumário
Neste artigo, aprendemos como aceitar os parâmetros de data em solicitações Spring MVC. Abordamos como fazer isso por solicitação e globalmente.
Também aprendemos como criar nossos próprios padrões de formatação de data.
Como sempre, todo o código-fonte está disponívelover on GitHub.