Werken met datumparameters in het voorjaar

1. Inleiding

In deze korte tutorial bekijken we hoe u kunt accepteren Datum, LocalDate en LocalDateTime parameters in Spring REST-verzoeken, zowel op verzoek- als toepassingsniveau.

2. Het probleem

Laten we eens kijken naar een controller met drie methoden die accepteren Datum, LocalDate en LocalDateTime parameters:

@RestController openbare klasse DateTimeController {@PostMapping ("/ date") openbare ongeldige datum (@RequestParam ("date") Datum datum) {// ...} @PostMapping ("/ localdate") openbare void localDate (@RequestParam ( "localDate") LocalDate localDate) {// ...} @PostMapping ("/ localdatetime") public void dateTime (@RequestParam ("localDateTime") LocalDateTime localDateTime) {// ...}}

Bij het verzenden van een POST-verzoek naar een van deze methoden met een parameter die is opgemaakt in overeenstemming met ISO 8601, krijgen we een uitzondering.

Als u bijvoorbeeld "2018-10-22" naar het /datum eindpunt krijgen we een fout met een slecht verzoek met een bericht dat lijkt op dit:

De waarde van het type 'java.lang.String' kan niet worden geconverteerd naar het vereiste type 'java.time.LocalDate'; geneste uitzondering is org.springframework.core.convert.ConversionFailedException.

Dit komt doordat Spring standaard String-parameters niet naar een datum- of tijdobject kan converteren.

3. Converteer datumparameters op verzoekniveau

Een van de manieren om met dit probleem om te gaan, is door de parameters te annoteren met de @DateTimeFormat annotatie en geef een opmaakpatroonparameter op:

@RestController openbare klasse DateTimeController {@PostMapping ("/ date") openbare ongeldige datum (@RequestParam ("date") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE) Datum datum) {// ...} @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) {// ...}}

Op deze manier worden de strings correct geconverteerd naar datumobjecten, op voorwaarde dat de strings zijn geformatteerd met het ISO 8601-formaat.

We kunnen ook onze eigen conversiepatronen gebruiken. We kunnen gewoon een patroonparameter opgeven in het @DateTimeFormat annotatie:

@PostMapping ("/ date") public void date (@RequestParam ("date") @DateTimeFormat (pattern = "dd.MM.yyyy") Datum datum) {// ...}

4. Converteer datumparameters op toepassingsniveau

Een andere manier om de conversie van datum- en tijdobjecten in Spring af te handelen, is door een globale configuratie te bieden. Door de officiële documentatie te volgen, moeten we het WebMvcConfigurationSupport configuratie en breidt zijn mvcConversionService methode:

@Configuration openbare klasse DateTimeConfig breidt WebMvcConfigurationSupport uit {@Bean @Override openbare FormattingConversionService mvcConversionService () {DefaultFormattingConversionService conversionService = nieuw DefaultFormattingConversionService (false); DateTimeFormatterRegistrar dateTimeRegistrar = nieuwe DateTimeFormatterRegistrar (); dateTimeRegistrar.setDateFormatter (DateTimeFormatter.ofPattern ("dd.MM.jjjj")); dateTimeRegistrar.setDateTimeFormatter (DateTimeFormatter.ofPattern ("dd.MM.yyyy HH: mm: ss")); dateTimeRegistrar.registerFormatters (conversionService); DateFormatterRegistrar dateRegistrar = nieuwe DateFormatterRegistrar (); dateRegistrar.setFormatter (nieuwe DateFormatter ("dd.MM.jjjj")); dateRegistrar.registerFormatters (conversionService); return conversionService; }}

Eerst creëren we DefaultFormattingConversionService met een false parameter, wat betekent dat Spring standaard geen formatters registreert.

Vervolgens moeten we onze aangepaste formaten voor datum- en datum-tijdparameters registreren. We moeten dit doen door twee registrars met aangepaste opmaak te registreren. De eerste - DateTimeFormatterRegistar zal verantwoordelijk zijn voor het parseren van het LocalDate en LocaDateTime voorwerpen. De tweede - DateFormattingRegistrar zal omgaan met de Datum voorwerp.

5. Samenvatting

In dit artikel hebben we geleerd hoe we de datumparameters kunnen accepteren in Spring MVC-aanvragen. We hebben besproken hoe u dit per verzoek en wereldwijd kunt doen.

We hebben ook geleerd hoe we onze eigen datumnotatiepatronen kunnen maken.

Zoals altijd is alle broncode beschikbaar op GitHub.