Jarné vlastné overenie MVC

1. Prehľad

Všeobecne, keď potrebujeme overiť vstup používateľa, Spring MVC ponúka štandardné preddefinované validátory.

Keď však potrebujeme overiť konkrétnejší typ vstupu, máme možnosť vytvoriť si vlastnú, vlastnú validačnú logiku.

V tomto článku to urobíme práve tak, že vytvoríme vlastný validátor na overenie formulára s poľom telefónneho čísla a potom ukážeme vlastný validátor pre viac polí.

Tento článok sa zameriava na jarné MVC. Náš článok Validácia v Spring Boot popisuje, ako vykonať vlastné validácie v Spring Boot.

2. Inštalácia

Ak chcete využívať výhody API, pridajte závislosť do svojho pom.xml spis:

 org.hibernate hibernate-validator 6.0.10. Konečné 

Najnovšiu verziu závislosti si môžete skontrolovať tu.

Ak používame Spring Boot, môžeme pridať iba web-jar-boot-startér, ktoré prinesú hibernácia-validátor závislosť tiež.

3. Vlastné overenie

Vytvorenie vlastného validátora so sebou nesie zavedenie vlastnej anotácie a jej použitie v našom modeli na vynútenie overovacích pravidiel.

Poďme teda vytvoriť náš custom validator - ktorý kontroluje telefónne čísla. Telefónne číslo musí byť číslo s viac ako ôsmimi číslicami, ale nie viac ako 11 číslicami.

4. Nová anotácia

Vytvorme nový @rozhranie definovať našu anotáciu:

@Documented @Constraint (validatedBy = ContactNumberValidator.class) @Target ({ElementType.METHOD, ElementType.FIELD}) @Retention (RetentionPolicy.RUNTIME) public @interface ContactNumberConstraint {String message () default "Neplatné telefónne číslo"; Skupiny [] skupiny () predvolené {}; Trieda [] užitočné zaťaženie () predvolené {}; }

Vďaka @Constraint anotáciu, definovali sme triedu, ktorá sa chystá validovať naše pole, správa () je chybové hlásenie, ktoré sa zobrazuje v používateľskom rozhraní, a doplnkový kód je väčšinou štandardným kódom, ktorý zodpovedá jarným štandardom.

5. Vytvorenie validátora

Poďme teraz vytvoriť triedu validátora, ktorá vynúti pravidlá našej validácie:

verejná trieda ContactNumberValidator implementuje ConstraintValidator {@Override public void initialize (ContactNumberConstraint contactNumber) {} @Override public boolean isValid (String contactField, ConstraintValidatorContext cxt) {return contactField! = null && contactField.matches ("[0-9] (contactField.length ()> 8) && (contactField.length () <14); }}

Trieda validácie implementuje ConstraintValidator rozhranie a musí implementovať je platné metóda; v tejto metóde sme definovali naše pravidlá overovania.

Prirodzene, ideme s jednoduchým pravidlom validácie, aby sme ukázali, ako funguje validátor.

ConstraintValidator ddefinuje logiku na validáciu daného obmedzenia pre daný objekt. Implementácie musia byť v súlade s nasledujúcimi obmedzeniami:

  • objekt sa musí vyriešiť na neparametrizovaný typ
  • všeobecné parametre objektu musia byť neobmedzené zástupné typy

6. Aplikácia validačnej anotácie

V našom prípade sme vytvorili jednoduchú triedu s jedným poľom na uplatnenie overovacích pravidiel. Tu nastavujeme naše anotované pole na overenie:

@ContactNumberConstraint private String phone;

Definovali sme pole reťazca a anotovali ho svojou vlastnou anotáciou @ContactNumberConstraint. V našom radiči sme vytvorili naše mapovania a prípadnú chybu sme spracovali:

@Controller public class ValidatedPhoneController {@GetMapping ("/ validatePhone") public String loadFormPage (Model m) {m.addAttribute ("validatedPhone", new ValidatedPhone ()); vrátiť "phoneHome"; } @PostMapping ("/ addValidatePhone") public String submitForm (@Valid ValidatedPhone validatedPhone, BindingResult result, Model m) {if (result.hasErrors ()) {return "phoneHome"; } m.addAttribute ("správa", "Úspešne uložený telefón:" + validatedPhone.toString ()); vrátiť "phoneHome"; }}

Definovali sme tento jednoduchý radič, ktorý má jeden JSP stránke a použite odoslať formulár metóda na vynútenie overenia platnosti nášho telefónneho čísla.

7. Pohľad

Náš pohľad je základná stránka JSP s formulárom, ktorý má jediné pole. Keď užívateľ odošle formulár, potom sa pole validuje našim vlastným validátorom a presmeruje sa na tú istú stránku so správou o úspešnej alebo neúspešnej validácii:

 Telefón: 

8. Skúšky

Poďme teraz otestovať náš radič a skontrolovať, či nám poskytuje primeranú odpoveď a pohľad:

@Test public void givenPhonePageUri_whenMockMvc_thenReturnsPhonePage () {this.mockMvc. perform (get ("/ validatePhone")). andExpect (view (). name ("phoneHome")); }

Vyskúšajme tiež, že naše pole je overené na základe vstupu používateľa:

@Test public void givenPhoneURIWithPostAndFormData_whenMockMVC_thenVerifyErrorResponse () {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ addValidatePhone"). Accept (MediaType.TEXT_HTML) "," "phoneInput" andExpect (model (). attributeHasFieldErrorCode ("validatedPhone", "phone", "ContactNumberConstraint")). andExpect (view (). name ("phoneHome")). andExpect (status (). isOk ()). andDo (print ()); }

V teste poskytujeme používateľovi vstup „123“ a - ako sme očakávali - všetko funguje a vidíme chybu na strane klienta.

9. Overenie na úrovni vlastnej triedy

Na úrovni triedy možno tiež definovať vlastnú anotáciu overenia, aby sa overil viac ako jeden atribút triedy.

Bežným prípadom použitia pre tento scenár je overenie, či dve polia triedy majú zhodné hodnoty.

9.1. Vytvorenie anotácie

Pridajme novú anotáciu s názvom FieldsValueMatch ktoré možno neskôr použiť na triedu. Anotácia bude mať dva parametre lúka a fieldMatch ktoré predstavujú názvy polí na porovnanie:

@Constraint (validatedBy = FieldsValueMatchValidator.class) @Target ({ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) public @interface FieldsValueMatch {String message () default "Hodnoty polí sa nezhodujú!"; Reťazcové pole (); Reťazec fieldMatch (); @Target ({ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @interface List {FieldsValueMatch [] hodnota (); }}

Vidíme, že naša vlastná anotácia tiež obsahuje a Zoznam sub-rozhranie pre definovanie viacerých FieldsValueMatch anotácie k triede.

9.2. Vytvorenie validátora

Ďalej musíme pridať FieldsValueMatchValidator trieda, ktorá bude obsahovať skutočnú logiku validácie:

verejná trieda FieldsValueMatchValidator implementuje ConstraintValidator {súkromné ​​reťazcové pole; private String fieldMatch; public void initialize (FieldsValueMatch constraintAnnotation) {this.field = constraintAnnotation.field (); this.fieldMatch = constraintAnnotation.fieldMatch (); } public boolean isValid (hodnota objektu, kontext ConstraintValidatorContext) {Object fieldValue = nový BeanWrapperImpl (hodnota) .getPropertyValue (pole); Objekt fieldMatchValue = nový BeanWrapperImpl (hodnota) .getPropertyValue (fieldMatch); if (fieldValue! = null) {return fieldValue.equals (fieldMatchValue); } else {return fieldMatchValue == null; }}}

The je platné() metóda načíta hodnoty dvoch polí a skontroluje, či sú rovnaké.

9.3. Uplatnenie anotácie

Vytvorme a NewUserForm modelová trieda určená pre údaje požadované na registráciu užívateľa, ktorá má dve e-mail a heslo atribúty, spolu s dvoma potvrdiť Email a Overte heslo atribúty na opätovné zadanie týchto dvoch hodnôt.

Pretože máme dve polia na porovnanie s ich zodpovedajúcimi zhodnými poľami, pridajme dve @FieldsValueMatch anotácie na NewUserForm triedy, jeden pre e-mail hodnoty a jeden pre heslo hodnoty:

@ FieldsValueMatch.List ({@FieldsValueMatch (field = "heslo", fieldMatch = "verifyPassword", message = "heslá sa nezhodujú!"), @FieldsValueMatch (field = "email", fieldMatch = "verifyEmail", message = ") E-mailové adresy sa nezhodujú! ")}) Public class NewUserForm {private String email; private String verifyEmail; súkromné ​​reťazcové heslo; private String verifyPassword; // štandardný konštruktor, getre, setre}

Na overenie modelu na jar MVC vytvorme radič s a / užívateľ POST mapovanie, ktoré prijíma a NewUserForm objekt s poznámkou @ Platné a overí, či existujú nejaké chyby overenia:

@Controller public class NewUserController {@GetMapping ("/ user") public String loadFormPage (Model model) {model.addAttribute ("newUserForm", new NewUserForm ()); vrátiť "userHome"; } @PostMapping ("/ user") public String submitForm (@Valid NewUserForm newUserForm, BindingResult result, Model model) {if (result.hasErrors ()) {return "userHome"; } model.addAttribute ("správa", "platný formulár"); vrátiť "userHome"; }}

9.4. Testovanie anotácie

Na overenie našej vlastnej anotácie na úrovni triedy napíšeme a JUnit test, ktorý odošle zhodné informácie do / užívateľ koncový bod, potom overí, či odpoveď neobsahuje žiadne chyby:

public class ClassValidationMvcTest {private MockMvc mockMvc; @ Pred public void setup () {this.mockMvc = MockMvcBuilders .standaloneSetup (nový NewUserController ()). Build (); } @Test public void givenMatchingEmailPassword_whenPostNewUserForm_thenOk () vyvolá výnimku {this.mockMvc.perform (MockMvcRequestBuilders .post ("/ user") .accept (MediaType.TEXT_HTML) .param ("email", "[e-mail chránený]"). ("verifyEmail", "[chránený e-mailom]") .param ("heslo", "prejsť") .param ("verifyPassword", "prejsť")) .andExpect (model (). errorCount (0)) .andExpect ( status (). isOk ()); }}

Ďalej pridajme a JUnit test, ktorý pošle nezhodné informácie do / užívateľ koncový bod a tvrdiť, že výsledok bude obsahovať dve chyby:

@Test public void givenNotMatchingEmailPassword_whenPostNewUserForm_thenOk () vyvolá výnimku {this.mockMvc.perform (MockMvcRequestBuilders .post ("/ user") .accept (MediaType.TEXT_HTML) .param ("email", "[e-mail chránený" "). verifyEmail "," [chránené e-mailom] ") .param (" heslo "," prejsť ") .param (" verifyPassword "," heslá ")). aExpect (model (). errorCount (2)). aExpect (stav ( ) .isOk ()); }

10. Zhrnutie

V tomto rýchlom článku sme si ukázali, ako vytvoriť vlastné validátory na overenie poľa alebo triedy a ich prepojenie s Spring MVC.

Ako vždy, kód z článku nájdete na Githube.


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