Lavorare con i parametri della data in primavera

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.