Razlike u @Valid i @Validated Annotations u proljeće

1. Pregled

U ovom brzom vodiču usredotočit ćemo se na razlike između @Valid i @Validirano bilješke u proljeće.

Provjera korisničkog unosa uobičajena je funkcionalnost većine naših aplikacija. U Java ekosustavu posebno koristimo Java Standard Bean Validation API da bismo to podržali. Štoviše, ovo je također dobro integrirano s Springom od verzije 4.0 nadalje. The @Valid i @Validirano napomene potječu iz ovog API-ja Standard Bean.

U sljedećim odjeljcima, pogledajmo ih detaljno.

2. @Valid i @Validirano Bilješke

U proljeće koristimo JSR-303 @Valid napomena za provjeru valjanosti na razini metode. Štoviše, koristimo ga i za označavanje atributa člana za provjeru valjanosti. Međutim, ova napomena ne podržava provjeru grupe.

Grupe pomažu u ograničavanju ograničenja koja se primjenjuju tijekom provjere valjanosti. Jedan od posebnih slučajeva su čarobnjaci korisničkog sučelja. Ovdje, u prvom koraku, možemo imati određenu podskupinu polja. U sljedećem koraku može postojati još jedna skupina koja pripada istom zrnu. Stoga moramo primijeniti ograničenja na ta ograničena polja u svakom koraku, ali @Valid ne podržava ovo.

U ovom slučaju, za grupnu razinu moramo koristiti Spring's @Validirano, što je inačica ovog JSR-303 @Valid. To se koristi na razini metode. A za označavanje atributa člana i dalje koristimo @Valid bilješka.

Sada, zaronimo i pogledajte primjer upotrebe ovih napomena.

3. Primjer

Razmotrimo jednostavan obrazac za registraciju korisnika razvijen pomoću Spring Boot-a. Za početak ćemo imati samo Ime i zaporka atributi:

javna klasa UserAccount {@NotNull @Size (min = 4, max = 15) privatna lozinka niza; @NotBlank naziv privatnog niza; // standardni konstruktori / postavljači / getteri / toString} 

Dalje, pogledajmo kontroler. Evo, imat ćemo saveBasicInfo metoda s @Valid napomena za provjeru korisničkog unosa:

@RequestMapping (value = "/ saveBasicInfo", method = RequestMethod.POST) public String saveBasicInfo (@Valid @ModelAttribute ("useraccount") UserAccount useraccount, BindingResult result, ModelMap model) {if (result.hasErrors ()) {return " pogreška "; } povratak "uspjeh"; }

Ajmo sada testirati ovu metodu:

@Test javna praznina givenSaveBasicInfo_whenCorrectInput_thenSuccess () baca izuzetak {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ saveBasicInfo") .accept (MediaType.TEXT_HTML) .param ("name", "test123"). "pass")) .andExpect (view (). name ("success")) .andExpect (status (). isOk ()) .andDo (print ()); }

Nakon što potvrdimo da se test uspješno izvodi, proširimo sada funkcionalnost. Sljedeći je logični korak pretvoriti ga u obrazac za registraciju u više koraka, kao što je to slučaj kod većine čarobnjaka. Prvi korak s Ime i zaporka ostaje nepromjenjen. U drugom ćemo koraku dohvatiti dodatne informacije poput dob i telefon. Stoga ćemo ažurirati naš objekt domene sljedećim dodatnim poljima:

javna klasa UserAccount {@NotNull @Size (min = 4, max = 15) privatna lozinka niza; @NotBlank naziv privatnog niza; @Min (vrijednost = 18, message = "Dob ne smije biti manja od 18 godina") int int age; @NotBlank privatni String telefon; // standardni konstruktori / postavljači / getteri / toString} 

Međutim, ovog ćemo puta primijetiti da prethodni test nije uspio. To je zato što ne prolazimo u dob i telefon polja, koja još uvijek nisu na slici na korisničkom sučelju. Da bismo podržali ovo ponašanje, trebat će nam provjera valjanosti grupe i @Validirano bilješka.

Za to moramo grupirati polja stvarajući dvije različite skupine. Prvo, trebat ćemo stvoriti dva sučelja s markerima. Za svaku grupu ili svaki korak zasebno. Točnu provedbu ovoga možemo uputiti na naš članak o grupnoj provjeri valjanosti. Ovdje ćemo se usredotočiti na razlike u bilješkama.

Imat ćemo Osnovne informacije sučelje za prvi korak i AdvanceInfo za drugi korak. Nadalje, ažurirat ćemo naš Korisnički račun klasa za korištenje ovih sučelja markera na sljedeći način:

javna klasa UserAccount {@NotNull (groups = BasicInfo.class) @Size (min = 4, max = 15, groups = BasicInfo.class) privatna lozinka niza; @NotBlank (groups = BasicInfo.class) ime privatnog niza; @Min (vrijednost = 18, message = "Dob ne smije biti manja od 18 godina", groups = AdvanceInfo.class) private int age; @NotBlank (groups = AdvanceInfo.class) privatni String telefon; // standardni konstruktori / postavljači / getteri / toString} 

Pored toga, sada ćemo ažurirati naš kontroler da koristi @Validirano bilješka umjesto @Valid:

@RequestMapping (value = "/ saveBasicInfoStep1", method = RequestMethod.POST) public String saveBasicInfoStep1 (@Validated (BasicInfo.class) @ModelAttribute ("useraccount") UserAccount useraccount, BindingResult result (Model result map) {r (Model Model Map) )) {return "pogreška"; } povratak "uspjeh"; }

Kao rezultat ovog ažuriranja, naš se test sada uspješno izvodi. Ajmo sada i testirati ovu novu metodu:

@Test public void givenSaveBasicInfoStep1_whenCorrectInput_thenSuccess () baca izuzetak {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ saveBasicInfoStep1") .accept (MediaType.TEXT_HTML) .param ("name", param ("name", param ("name", param ("name", param ("name", test "), param (" ime ", test") "pass")) .andExpect (view (). name ("success")) .andExpect (status (). isOk ()) .andDo (print ()); }

I ovo se uspješno izvodi. Stoga možemo vidjeti kako korištenje @Validirano je presudan za grupnu provjeru valjanosti.

Dalje, da vidimo kako @Valid je presudan za pokretanje provjere valjanosti ugniježđenih atributa.

4. Korištenje @Valid Bilješka uz označavanje ugniježđenih objekata

The @Valid napomena se posebno koristi za označavanje ugniježđenih atributa. To pokreće provjeru valjanosti ugniježđenog objekta. Na primjer, u našem trenutnom scenariju, izradimo a Adresa korisnika objekt:

javna klasa UserAddress {@NotBlank private String countryCode; // standardni konstruktori / postavljači / getteri / toString}

Da bismo osigurali provjeru valjanosti ovog ugniježđenog objekta, atribut ćemo ukrasiti znakom @Valid napomena:

javna klasa UserAccount {// ... @Valid @NotNull (groups = AdvanceInfo.class) private UserAddress useraddress; // standardni konstruktori / postavljači / getteri / toString}

5. Prednosti i nedostaci

Pogledajmo neke prednosti i nedostatke korištenja @Valid i @Validirano bilješke u proljeće.

The @Valid napomena osigurava provjeru valjanosti cijelog objekta. Važno je da vrši provjeru cjelovitih grafova objekata. Međutim, to stvara probleme za scenarije koji trebaju samo djelomičnu provjeru.

S druge strane, možemo koristiti @Validirano za grupnu provjeru valjanosti, uključujući gornju djelomičnu provjeru valjanosti. Međutim, u ovom slučaju, provjereni entiteti moraju znati pravila provjere valjanosti za sve skupine ili slučajeve upotrebe u kojima se koristi. Ovdje miješamo zabrinutosti, pa to može rezultirati anti-uzorkom.

6. Zaključak

U ovom smo brzom vodiču istražili ključne razlike između @Valid i @Validirano Bilješke.

Da zaključimo, za bilo koju osnovnu provjeru valjanosti upotrijebit ćemo JSR @Valid napomena u pozivima naše metode. S druge strane, za bilo koju provjeru grupe, uključujući grupne sekvence, trebat ćemo koristiti Spring-ove @Validirano napomena u našem pozivu metode. The @Valid napomena je također potrebna za pokretanje provjere ugniježđenih svojstava.

Kao i uvijek, kôd predstavljen u ovom članku dostupan je na GitHubu.