Rad s parametrima datuma u proljeće

1. Uvod

U ovom kratkom uputstvu pogledat ćemo kako prihvatiti Datum, LocalDate i LocalDateTime parametara u Spring REST zahtjevima, kako na razini zahtjeva tako i na razini aplikacije.

2. Problem

Razmotrimo kontroler s tri metode koje prihvaćaju Datum, LocalDate i LocalDateTime parametri:

@RestController javna klasa DateTimeController {@PostMapping ("/ date") datum javne praznine (@RequestParam ("date") Datum datum) {// ...} @PostMapping ("/ localdate") javna void localDate (@RequestParam ( "localDate") LocalDate localDate) {// ...} @PostMapping ("/ localdatetime") public void dateTime (@RequestParam ("localDateTime") LocalDateTime localDateTime) {// ...}}

Kada šaljemo POST zahtjev bilo kojoj od tih metoda s parametrom formatiranim u skladu s ISO 8601, dobit ćemo iznimku.

Na primjer, kada šaljete "2018-10-22" na /datum krajnja točka dobit ćemo pogrešnu pogrešku zahtjeva s porukom sličnom ovoj:

Nije uspjelo pretvoriti vrijednost tipa 'java.lang.String' u traženi tip 'java.time.LocalDate'; ugniježđena iznimka je org.springframework.core.convert.ConversionFailedException.

To je zato što Spring prema zadanim postavkama ne može pretvoriti parametre niza u bilo koji datumski ili vremenski objekt.

3. Pretvori datumske parametre na razini zahtjeva

Jedan od načina rješavanja ovog problema je bilježenje parametara pomoću @DateTimeFormat napomena i pružiti parametar uzorka oblikovanja:

@RestController javna klasa DateTimeController {@PostMapping ("/ date") javni datum praznine (@RequestParam ("date") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE) Datum datum) {// ...} @PostMapping (" / local-date ") javna void localDate (@RequestParam (" localDate ") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {// ...} @PostMapping (" / local-date-time ") javna void dateTime (@RequestParam ("localDateTime") @DateTimeFormat (iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {// ...}}

Na taj će se način Nizovi pravilno pretvoriti u datumske objekte, pod uvjetom da su Nizovi formatirani u formatu ISO 8601.

Također možemo koristiti vlastite obrasce pretvorbe. Možemo samo pružiti parametar uzorka u @DateTimeFormat napomena:

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

4. Pretvorite parametre datuma na razini aplikacije

Drugi način obrade pretvorbe objekta datuma i vremena u proljeće je pružanje globalne konfiguracije. Slijedom službene dokumentacije trebali bismo proširiti WebMvcConfigurationSupport konfiguracija i proširuje svoj mvcConversionService metoda:

@Configuration javna klasa DateTimeConfig proširuje WebMvcConfigurationSupport {@Bean @Override public FormattingConversionService mvcConversionService () {DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService (false); DateTimeFormatterRegistrar dateTimeRegistrar = novo DateTimeFormatterRegistrar (); dateTimeRegistrar.setDateFormatter (DateTimeFormatter.ofPattern ("dd.MM.yyyy")); dateTimeRegistrar.setDateTimeFormatter (DateTimeFormatter.ofPattern ("dd.MM.gggg HH: mm: ss")); dateTimeRegistrar.registerFormatters (conversionService); DateFormatterRegistrar dateRegistrar = novo DateFormatterRegistrar (); dateRegistrar.setFormatter (novi DateFormatter ("dd.MM.gggg")); dateRegistrar.registerFormatters (conversionService); return conversionService; }}

Prvo, mi stvaramo DefaultFormattingConversionService s false parametrom, što znači da Spring prema zadanim postavkama neće registrirati nijedan program za oblikovanje.

Dalje, moramo registrirati naše prilagođene formate za parametre datuma i datuma i vremena. To moramo učiniti registracijom dvaju registratora prilagođenog oblikovanja. Prvi - DateTimeFormatterRegistar bit će odgovoran za raščlanjivanje LocalDate i LocaDateTime predmeta. Drugi - DateFormattingRegistrar će se nositi s Datum objekt.

5. Sažetak

U ovom smo članku naučili kako prihvatiti parametre datuma u proljetnim MVC zahtjevima. Objasnili smo kako to učiniti po zahtjevu i globalno.

Također smo naučili kako stvoriti vlastite obrasce oblikovanja datuma.

Kao i uvijek sav izvorni kod dostupan je na GitHub-u.