Rozdiely v poznámkach @Valid a @Validated na jar
1. Prehľad
V tomto rýchlom výučbe sa zameriame na rozdiely medzi nimi @ Platné a @Overené anotácie na jar.
Overovanie vstupu používateľov je bežnou funkciou väčšiny našich aplikácií. V prostredí Java Ecosystem na ich podporu konkrétne používame rozhranie Java Standard Bean Validation API. Okrem toho je to tiež dobre integrované do verzie Spring od verzie 4.0. The @ Platné a @Overené anotácie vychádzajú z tohto API Standard Bean.
V ďalších častiach sa na ne pozrime podrobne.
2. @ Platné a @Overené Anotácie
Na jar používame JSR-303 @ Platné anotácia pre validáciu na úrovni metódy. Okrem toho ho tiež používame na označenie atribútu člena na overenie. Táto anotácia však nepodporuje skupinové overenie.
Skupiny pomáhajú obmedziť obmedzenia uplatnené počas overovania. Jedným konkrétnym prípadom použitia sú sprievodcovia používateľským rozhraním. Tu v prvom kroku môžeme mať určitú podskupinu polí. V nasledujúcom kroku môže existovať ďalšia skupina patriaca do tej istej fazule. Z tohto dôvodu musíme v každom kroku uplatňovať obmedzenia na tieto obmedzené polia, ale @ Platné toto nepodporuje.
V tomto prípade, na úrovni skupiny musíme použiť Spring @Validated, čo je variant tohto JSR-303 @ Platné. Používa sa to na úrovni metódy. A na označovanie atribútov členov naďalej používame @ Platné anotácia.
Poďme sa teraz spolu ponoriť a na príklade sa pozrieme na použitie týchto anotácií.
3. Príklad
Uvažujme o jednoduchom registračnom formulári používateľa vyvinutom pomocou nástroja Spring Boot. Na začiatok budeme mať iba názov a heslo atribúty:
verejná trieda UserAccount {@NotNull @Size (min = 4, max = 15) súkromné reťazcové heslo; @NotBlank súkromné meno reťazca; // štandardné konštruktory / setre / getre / toString}
Ďalej sa pozrime na ovládač. Tu budeme mať saveBasicInfo metóda s @ Platné anotácia na overenie vstupu používateľa:
@RequestMapping (value = "/ saveBasicInfo", method = RequestMethod.POST) public String saveBasicInfo (@Valid @ModelAttribute ("useraccount") UserAccount useraccount, BindingResult result, ModelMap model) {if (result.hasErrors ()) {return " chyba"; } návrat "úspech"; }
Teraz otestujme túto metódu:
@Test public void givenSaveBasicInfo_whenCorrectInput_thenSuccess () vyvolá výnimku {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ saveBasicInfo") .accept (MediaType.TEXT_HTML) .param ("name", "test123") .param „pass“))) .andExpect (view (). name („success“)) .andExpect (status (). isOk ()) .andDo (print ()); }
Po potvrdení úspešného vykonania testu si rozšírime funkčnosť. Ďalším logickým krokom je konverzia tohto formulára na viacstupňový registračný formulár, ako je to u väčšiny čarodejníkov. Prvý krok s názov a heslo zostáva nezmenený. V druhom kroku načítame ďalšie informácie ako Vek a telefón. Preto aktualizujeme náš doménový objekt o tieto ďalšie polia:
verejná trieda UserAccount {@NotNull @Size (min = 4, max = 15) súkromné reťazcové heslo; @NotBlank súkromné meno reťazca; @ Min (hodnota = 18, message = "Vek by nemal byť menší ako 18") súkromný vek; @NotBlank súkromný telefónny reťazec; // štandardné konštruktory / setre / getre / toString}
Tentokrát si však všimneme, že predchádzajúci test zlyhal. Je to preto, že nejdeme okolo Vek a telefón polia, ktoré stále nie sú na obrázku v používateľskom rozhraní. Na podporu tohto správania budeme potrebovať overenie skupiny a @Overené anotácia.
Za týmto účelom musíme zoskupiť polia a vytvoriť tak dve odlišné skupiny. Najskôr budeme musieť vytvoriť dve značkovacie rozhrania. Samostatný pre každú skupinu alebo pre každý krok. Presnú implementáciu tohto článku si môžeme pozrieť v našom článku o skupinovej validácii. Tu sa zamerajme na rozdiely v anotáciách.
Budeme mať Základné informácie rozhranie pre prvý krok a AdvanceInfo pre druhý krok. Ďalej aktualizujeme naše Užívateľský účet triedy používať tieto značkovacie rozhrania nasledovne:
verejná trieda UserAccount {@NotNull (groups = BasicInfo.class) @Size (min = 4, max = 15, groups = BasicInfo.class) súkromné reťazcové heslo; @NotBlank (groups = BasicInfo.class) súkromné meno reťazca; @ Min (hodnota = 18, message = "Vek by nemal byť menší ako 18", groups = AdvanceInfo.class) súkromný vek; @NotBlank (skupiny = AdvanceInfo.class) súkromný reťazcový telefón; // štandardné konštruktory / setre / getre / toString}
Okrem toho teraz aktualizujeme náš radič, aby používal @Overené anotácia namiesto @ Platné:
@RequestMapping (value = "/ saveBasicInfoStep1", method = RequestMethod.POST) verejný reťazec saveBasicInfoStep1 (@Validated (BasicInfo.class) @ModelAttribute ("useraccount") UserAccount useraccount, výsledok BindingResult, ModelMaph model) {if (model) )) {return "chyba"; } návrat "úspech"; }
Výsledkom tejto aktualizácie je, že náš test teraz prebieha úspešne. Teraz otestujme aj túto novú metódu:
@Test public void givenSaveBasicInfoStep1_whenCorrectInput_thenSuccess () vyvolá výnimku {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ saveBasicInfoStep1") .accept (MediaType.TEXT_HTML) .param ("name", "" "" " „pass“))) .andExpect (view (). name („success“)) .andExpect (status (). isOk ()) .andDo (print ()); }
Aj toto beží úspešne. Preto môžeme vidieť ako použitie @Overené je nevyhnutné pre skupinovú validáciu.
Ďalej sa pozrime ako @ Platné je nevyhnutné na spustenie validácie vnorených atribútov.
4. Používanie @ Platné Anotácia k označeniu vnorených objektov
The @ Platné anotácia sa používa najmä na označenie vnorených atribútov. To spustí overenie vnoreného objektu. Napríklad v našom súčasnom scenári vytvorme a UserAddress objekt:
verejná trieda UserAddress {@NotBlank private String countryCode; // štandardné konštruktory / setre / getre / toString}
Aby sme zaistili validáciu tohto vnoreného objektu, atribút zdobíme znakom @ Platné anotácia:
verejná trieda UserAccount {// ... @Valid @NotNull (groups = AdvanceInfo.class) súkromná UserAddress adresa používateľa; // štandardné konštruktory / setre / getre / toString}
5. Klady a zápory
Pozrime sa na niektoré klady a zápory používania @ Platné a @Overené anotácie na jar.
The @ Platné anotácia zaisťuje validáciu celého objektu. Dôležité je, že vykonáva validáciu celých objektových grafov. To však vytvára problémy pre scenáre, ktoré vyžadujú iba čiastočné overenie.
Na druhej strane môžeme použiť @Overené pre skupinovú validáciu, vrátane vyššie uvedenej čiastočnej validácie. V tomto prípade však musia overené entity poznať pravidlá overovania pre všetky skupiny alebo prípady použitia, v ktorých sa používa. Tu miešame obavy, preto to môže mať za následok anti-vzor.
6. Záver
V tomto rýchlom výučbe sme preskúmali kľúčové rozdiely medzi nimi @ Platné a @Overené Anotácie.
Na záver uvádzam, že pri akejkoľvek základnej validácii použijeme JSR @ Platné anotácia v našich volaní metód. Na druhú stranu, pre každú skupinovú validáciu, vrátane skupinových sekvencií, budeme musieť použiť Spring @Overené anotácia v našom volaní metódy. The @ Platné anotácia je tiež potrebná na spustenie overovania vnorených vlastností.
Ako vždy, kód uvedený v tomto článku je k dispozícii na GitHub.