1. Introducción
En este breve tutorial, veremos cómo aceptar los parámetros Date , LocalDate y LocalDateTime en las solicitudes Spring REST, tanto a nivel de solicitud como de aplicación.
2. El problema
Consideremos un controlador con tres métodos que aceptan los parámetros Date , LocalDate y LocalDateTime :
@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) { // ... } }
Al enviar una solicitud POST a cualquiera de esos métodos con un parámetro formateado de acuerdo con ISO 8601, obtendremos una excepción.
Por ejemplo, al enviar "2018-10-22" al punto final / date obtendremos un error de solicitud incorrecta con un mensaje similar a este:
Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException.
Esto se debe a que Spring, por defecto, no puede convertir los parámetros de cadena en ningún objeto de fecha u hora.
3. Convertir parámetros de fecha en el nivel de solicitud
Una de las formas de manejar este problema es anotar los parámetros con la anotación @DateTimeFormat y proporcionar un parámetro de patrón de formato:
@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) { // ... } }
De esta manera, las cadenas se convertirán correctamente en objetos de fecha, siempre que las cadenas estén formateadas con el formato ISO 8601.
También podemos utilizar nuestros propios patrones de conversión. Podemos simplemente proporcionar un parámetro de patrón en la anotación @DateTimeFormat :
@PostMapping("/date") public void date(@RequestParam("date") @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) { // ... }
4. Convertir parámetros de fecha a nivel de aplicación
Otra forma de manejar la conversión de objetos de fecha y hora en Spring es proporcionar una configuración global. Siguiendo la documentación oficial deberíamos extender la configuración de WebMvcConfigurationSupport y extiende su método mvcConversionService :
@Configuration public class DateTimeConfig extends WebMvcConfigurationSupport { @Bean @Override public FormattingConversionService mvcConversionService() { DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false); DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar(); dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy")); dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")); dateTimeRegistrar.registerFormatters(conversionService); DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar(); dateRegistrar.setFormatter(new DateFormatter("dd.MM.yyyy")); dateRegistrar.registerFormatters(conversionService); return conversionService; } }
Primero, creamos DefaultFormattingConversionService con un parámetro falso, lo que significa que Spring no registrará ningún formateador por defecto.
A continuación, debemos registrar nuestros formatos personalizados para los parámetros de fecha y fecha y hora. Necesitamos hacerlo registrando dos registradores de formato personalizado. El primero, DateTimeFormatterRegistar , será responsable de analizar los objetos LocalDate y LocaDateTime . El segundo, DateFormattingRegistrar manejará el objeto Date .
5. Resumen
En este artículo, hemos aprendido cómo aceptar los parámetros de fecha en las solicitudes Spring MVC. Hemos cubierto cómo hacerlo por solicitud y en todo el mundo.
También hemos aprendido a crear nuestros propios patrones de formato de fecha.
Como siempre, todo el código fuente está disponible en GitHub.