Arbejde med datoparametre om foråret

1. Introduktion

I denne korte vejledning ser vi på, hvordan man accepterer Dato, LocalDate og LocalDateTime parametre i Spring REST-anmodninger, både på anmodnings- og applikationsniveauer.

2. Problemet

Lad os overveje en controller med tre metoder, der accepterer Dato, LocalDate og LocalDateTime parametre:

@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) {// ...}}

Når vi sender en POST-anmodning til en af ​​disse metoder med en parameter formateret i overensstemmelse med ISO 8601, får vi en undtagelse.

For eksempel når du sender “2018-10-22” til /dato slutpunkt får vi en dårlig anmodningsfejl med en besked svarende til denne:

Kunne ikke konvertere værdien af ​​typen 'java.lang.String' til den krævede type 'java.time.LocalDate'; nestet undtagelse er org.springframework.core.convert.ConversionFailedException.

Dette skyldes, at Spring som standard ikke kan konvertere strengparametre til noget dato- eller tidsobjekt.

3. Konverter datoparametre på anmodningsniveau

En af måderne til at håndtere dette problem er at kommentere parametrene med @DateTimeFormat kommentar og give en formateringsparameterparameter:

@RestController offentlig klasse DateTimeController {@PostMapping ("/ date") ugyldig dato (@RequestParam ("date") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE) Dato dato) {// ...} @PostMapping (" / local-date ") offentlig ugyldig localDate (@RequestParam (" localDate ") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {// ...} @PostMapping (" / local-date-time ") offentlig ugyldig datoTime (@RequestParam ("localDateTime") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {// ...}}

På denne måde konverteres strengene korrekt til datoobjekter, forudsat at strengene er formateret ved hjælp af ISO 8601-formatet.

Vi kan også bruge vores egne konverteringsmønstre. Vi kan bare angive et mønsterparameter i @DateTimeFormat kommentar:

@PostMapping ("/ date") offentlig ugyldighedsdato (@RequestParam ("date") @DateTimeFormat (mønster = "dd.MM.åååå") Dato dato) {// ...}

4. Konverter dataparametre på applikationsniveau

En anden måde at håndtere konvertering af dato og klokkeslæt på i foråret er at give en global konfiguration. Ved at følge den officielle dokumentation skal vi udvide WebMvcConfigurationSupport konfiguration og udvider dens mvcConversionService metode:

@Configuration public class DateTimeConfig udvider WebMvcConfigurationSupport {@Bean @Override public FormattingConversionService mvcConversionService () {DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService (false); DateTimeFormatterRegistrar dateTimeRegistrar = ny DateTimeFormatterRegistrar (); dateTimeRegistrar.setDateFormatter (DateTimeFormatter.ofPattern ("dd.MM.yyyy")); dateTimeRegistrar.setDateTimeFormatter (DateTimeFormatter.ofPattern ("dd.MM.åååå HH: mm: ss")); dateTimeRegistrar.registerFormatters (conversionService); DateFormatterRegistrar dateRegistrar = ny DateFormatterRegistrar (); dateRegistrar.setFormatter (ny DateFormatter ("dd.MM.yyyy")); dateRegistrar.registerFormatters (conversionService); returnere konverteringService; }}

Først opretter vi StandardFormattingConversionService med en falsk parameter, hvilket betyder, at Spring ikke registrerer nogen formater som standard.

Dernæst skal vi registrere vores brugerdefinerede formater til parametre for dato og dato. Vi skal gøre det ved at registrere to tilpassede formateringsregistratorer. Den første - DateTimeFormatterRegistar vil være ansvarlig for at analysere LocalDate og LocaDateTime genstande. Den anden - DateFormattingRegistrar vil håndtere Dato objekt.

5. Resume

I denne artikel har vi lært, hvordan vi accepterer datoparametrene i MVC-forespørgsler om foråret. Vi har dækket, hvordan man gør det pr. Anmodning og globalt.

Vi har også lært, hvordan vi opretter vores egne datoformateringsmønstre.

Som altid er al kildekode tilgængelig på GitHub.