1. Introduzione
In questo breve tutorial, daremo un'occhiata a come accettare i parametri Date , LocalDate e LocalDateTime nelle richieste Spring REST, sia a livello di richiesta che di applicazione.
2. Il problema
Consideriamo un controller con tre metodi che accettano i parametri Date , LocalDate e 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) { // ... } }
Quando si invia una richiesta POST a uno di questi metodi con un parametro formattato in conformità con ISO 8601, si otterrà un'eccezione.
Ad esempio, quando si invia "2018-10-22" all'endpoint / date , riceveremo un errore di richiesta non valida con un messaggio simile a questo:
Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException.
Questo perché Spring per impostazione predefinita non può convertire i parametri String in alcun oggetto data o ora.
3. Convertire i parametri della data a livello di richiesta
Uno dei modi per gestire questo problema è annotare i parametri con l' annotazione @DateTimeFormat e fornire un parametro del modello di formattazione:
@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) { // ... } }
In questo modo, le stringhe verranno convertite correttamente in oggetti data, a condizione che le stringhe siano formattate utilizzando il formato ISO 8601.
Possiamo anche utilizzare i nostri modelli di conversione. Possiamo semplicemente fornire un parametro pattern nell'annotazione @DateTimeFormat :
@PostMapping("/date") public void date(@RequestParam("date") @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) { // ... }
4. Convertire i parametri della data a livello di applicazione
Un altro modo per gestire la conversione di oggetti di data e ora in Spring è fornire una configurazione globale. Seguendo la documentazione ufficiale dovremmo estendere la configurazione di WebMvcConfigurationSupport ed estendere il suo metodo 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; } }
Innanzitutto, creiamo DefaultFormattingConversionService con un parametro false, il che significa che Spring non registrerà alcun formattatore per impostazione predefinita.
Successivamente, dobbiamo registrare i nostri formati personalizzati per i parametri di data e data-ora. Dobbiamo farlo registrando due registrar con formattazione personalizzata. Il primo: DateTimeFormatterRegistar sarà responsabile dell'analisi degli oggetti LocalDate e LocaDateTime . Il secondo - DateFormattingRegistrar gestirà l' oggetto Date .
5. Riepilogo
In questo articolo abbiamo appreso come accettare i parametri della data nelle richieste Spring MVC. Abbiamo spiegato come farlo per richiesta e globalmente.
Abbiamo anche imparato come creare i nostri modelli di formattazione della data.
Come sempre tutto il codice sorgente è disponibile su GitHub.