Práca s parametrami dátumu na jar

1. Úvod

V tomto krátkom návode sa pozrieme na to, ako prijať Dátum, LocalDate a LocalDateTime parametre v požiadavkách Spring REST, a to na úrovni požiadaviek aj aplikácií.

2. Problém

Zvážme radič s tromi metódami, ktoré akceptujeme Dátum, LocalDate a LocalDateTime parametre:

@RestController verejná trieda 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) {// ...}}

Pri odosielaní požiadavky POST ktorejkoľvek z týchto metód s parametrom formátovaným v súlade s normou ISO 8601 dostaneme výnimku.

Napríklad pri odosielaní „2018-10-22“ do /dátum koncový bod, dostaneme chybu zlej požiadavky so správou podobnou tejto:

Nepodarilo sa previesť hodnotu typu „java.lang.String“ na požadovaný typ „java.time.LocalDate“; vnorenou výnimkou je org.springframework.core.convert.ConversionFailedException.

Je to preto, že Spring štandardne nemôže prevádzať parametre reťazca na žiadny objekt dátumu a času.

3. Preveďte parametre dátumu na úrovni žiadosti

Jedným zo spôsobov riešenia tohto problému je anotácia parametrov pomocou @DateTimeFormat anotáciu a zadajte parameter vzoru formátovania:

@RestController verejná trieda 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) {// ...}}

Týmto spôsobom budú reťazce správne prevedené na objekty dátumu, za predpokladu, že budú formátované pomocou formátu ISO 8601.

Môžeme tiež použiť vlastné vzory premeny. Môžeme len poskytnúť parameter vzoru v @DateTimeFormat anotácia:

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

4. Preveďte parametre dátumu na úrovni aplikácie

Ďalším spôsobom, ako zvládnuť konverziu objektu dátumu a času na jar, je poskytnúť globálnu konfiguráciu. Podľa oficiálnej dokumentácie by sme mali rozšíriť WebMvcConfigurationSupport konfiguráciu a rozširuje jej mvcConversionService metóda:

@Configuration verejná trieda DateTimeConfig rozširuje WebMvcConfigurationSupport {@Bean @Override public FormattingConversionService mvcConversionService () {DefaultFormattingConversionService conversionService = nový DefaultFormattingConversionService (false); DateTimeFormatterRegistrar dateTimeRegistrar = nový DateTimeFormatterRegistrar (); dateTimeRegistrar.setDateFormatter (DateTimeFormatter.ofPattern ("dd.MM.rrrr")); dateTimeRegistrar.setDateTimeFormatter (DateTimeFormatter.ofPattern ("dd.MM.rrrr HH: mm: ss")); dateTimeRegistrar.registerFormatters (conversionService); DateFormatterRegistrar dateRegistrar = nový DateFormatterRegistrar (); dateRegistrar.setFormatter (nový DateFormatter ("dd.MM.rrrr")); dateRegistrar.registerFormatters (conversionService); spätná konverziaSlužba; }}

Najskôr tvoríme DefaultFormattingConversionService s nepravdivým parametrom, čo znamená, že Spring predvolene neregistruje žiadnych formátovačov.

Ďalej musíme zaregistrovať naše vlastné formáty pre parametre dátumu a času. Musíme to urobiť registráciou dvoch registrátorov vlastného formátovania. Prvý - DateTimeFormatterRegistar bude zodpovedný za analýzu súboru LocalDate a LocaDateTime predmety. Druhý - DateFormattingRegistrar bude vybavovať Dátum objekt.

5. Zhrnutie

V tomto článku sme sa naučili, ako prijať parametre dátumu v požiadavkách na jar MVC. Pokryli sme, ako to urobiť na žiadosť a globálne.

Naučili sme sa tiež, ako vytvoriť vlastné vzory formátovania dátumu.

Celý zdrojový kód je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found