Rozdiel medzi obmedzeniami @NotNull, @NotEmpty a @NotBlank v overení fazule

1. Prehľad

Overenie fazule je štandardná špecifikácia overenia, ktorá nám umožňuje ľahko overiť objekty domény pomocou množiny obmedzení deklarovaných vo forme anotácií.

Aj keď je celkovo použitie implementácií overenia fazule, ako je napríklad Hibernate Validator, pomerne jednoduché, stojí za to preskúmať niektoré jemné - ale relevantné - rozdiely týkajúce sa spôsobu implementácie niektorých z týchto obmedzení.

V tomto návode všimneme si rozdiely medzi @NotNull, @Nie prázdny, a @NotBlank obmedzenia.

2. Závislosti Maven

Rýchlo vytvoriť pracovné prostredie a vyskúšať správanie @NotNull, @Nie prázdnya @NotBlank obmedzenia, najskôr musíme pridať požadované závislosti Maven.

V takom prípade na overenie našich doménových objektov použijeme Hibernate Validator, implementáciu referenčnej validácie fazule.

Tu je príslušná časť našej stránky pom.xml spis:

  org.hibernate hibernate-validator 6.0.13.Final org.glassfish javax.el 3.0.0 

V našich testoch jednotiek použijeme JUnit a AssertJ, takže nezabudnite skontrolovať najnovšie verzie hibernate-validator, implementáciu EL GlassFish, junit a assertj-core na Maven Central.

3. The @NotNull Obmedzenie

Poďme vpred implementovať naivitu UserNotNull doménovú triedu a obmedziť jej názov pole s @NotNull anotácia:

verejná trieda UserNotNull {@NotNull (message = "Názov nemusí mať null") súkromné ​​meno reťazca; // štandardné konštruktory / getre / toString}

Teraz musíme vidieť, ako na to @NotNull vlastne funguje pod kapotou.

Ak to chcete urobiť, vytvorme pre triedu jednoduchý test jednotky a overme niekoľko jej inštancií:

@BeforeClass public static void setupValidatorInstance () {validator = Validation.buildDefaultValidatorFactory (). GetValidator (); } @Test public void whenNotNullName_thenNoConstraintViolations () {UserNotNull user = new UserNotNull ("John"); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (0); } @Test public void whenNullName_thenOneConstraintViolation () {UserNotNull user = new UserNotNull (null); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (1); } @Test public void whenEmptyName_thenNoConstraintViolations () {UserNotNull user = new UserNotNull (""); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (0); } 

Podľa očakávania @NotNull obmedzenie neumožňuje nulové hodnoty pre obmedzené pole (polí). Aj napriek tomu môžu byť polia prázdne.

Aby sme tomu lepšie porozumeli, pozrime sa na NotNullValidator trieda' je platné() metóda, ktorú @NotNull obmedzujúce použitie. Implementácia metódy je skutočne triviálna:

public boolean isValid (Object object) {return object! = null; }

Ako je uvedené vyššie, pole (napr. CharSequence, Zbierka, Mapa, alebo Pole) obmedzený s @NotNull nesmie byť null. Prázdna hodnota je však úplne legálna.

4. The @Nie prázdny Obmedzenie

Teraz implementujme vzorku UserNotEmpty triedy a používať @Nie prázdny obmedzenie:

verejná trieda UserNotEmpty {@NotEmpty (message = "Meno nesmie byť prázdne") súkromné ​​meno reťazca; // štandardné konštruktory / getre / toString}

Keď je trieda na mieste, otestujme ju a priraďte k nej rôzne hodnoty názov lúka:

@Test public void whenNotEmptyName_thenNoConstraintViolations () {UserNotEmpty user = new UserNotEmpty ("John"); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (0); } @Test public void whenEmptyName_thenOneConstraintViolation () {UserNotEmpty user = new UserNotEmpty (""); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (1); } @Test public void whenNullName_thenOneConstraintViolation () {UserNotEmpty user = new UserNotEmpty (null); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (1); }

The @Nie prázdny anotácia využíva @NotNull trieda' je platné() implementácia a dodatočne skontroluje, či veľkosť / dĺžka dodávaného objektu (samozrejme líši sa to podľa typu overovaného objektu) je väčšia ako nula.

Stručne, to znamená, že pole (napr. CharSequence, Zbierka, Mapa, alebo Pole) obmedzený s @Nie prázdny nesmie byť null a jeho veľkosť / dĺžka musí byť väčšia ako nula.

Ďalej môžeme byť ešte viac obmedzujúci, ak použijeme @Nie prázdny anotácia v spojení s @ Veľkosť.

Pritom tiež vynútime, aby hodnoty minimálnej a maximálnej veľkosti objektu boli v uvedenom rozsahu min / max:

@NotEmpty (message = "Meno nesmie byť prázdne") @Size (min = 2, max = 32, message = "Meno musí mať dĺžku od 2 do 32 znakov") súkromné ​​meno reťazca; 

5. @NotBlank Obmedzenie

Podobne môžeme obmedziť pole triedy pomocou @NotBlank anotácia:

verejná trieda UserNotBlank {@NotBlank (message = "Meno nesmie zostať prázdne") súkromné ​​meno reťazca; // štandardné konštruktory / getre / toString}

Rovnakým spôsobom môžeme implementovať test jednotky, aby sme pochopili, ako @NotBlank obmedzujúce práce:

@Test public void whenNotBlankName_thenNoConstraintViolations () {UserNotBlank user = new UserNotBlank ("John"); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (0); } @Test public void whenBlankName_thenOneConstraintViolation () {UserNotBlank user = new UserNotBlank (""); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (1); } @Test public void whenEmptyName_thenOneConstraintViolation () {UserNotBlank user = new UserNotBlank (""); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (1); } @Test public void whenNullName_thenOneConstraintViolation () {UserNotBlank user = new UserNotBlank (null); Nastaviť priestupky = validator.validate (užívateľ); assertThat (violations.size ()). isEqualTo (1); } 

The @NotBlank anotácia používa NotBlankValidator trieda, ktorá kontroluje, či orezaná dĺžka sekvencie znakov nie je prázdna:

public boolean isValid (CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) if (charSequence == null) {return true; } návrat charSequence.toString (). orezanie (). dĺžka ()> 0; } 

Je dosť vtipné, že metóda vráti hodnotu true pre nulové hodnoty. Takže by sme si to mohli myslieť @NotBlank umožňuje nulové hodnoty, ale v skutočnosti to nie je možné.

The @NotNull metóda 'isValid () sa volá po @NotBlank trieda 'isValid (), teda zakazuje nulové hodnoty.

Zjednodušene povedané a String pole obmedzené @NotBlank nesmie byť nula a skrátená dĺžka musí byť väčšia ako nula.

6. Podrobné porovnanie

Doteraz sme sa podrobne zaoberali tým, ako @NotNull, @Nie prázdnya @NotBlank obmedzenia fungujú individuálne na poliach triedy.

Urobme rýchle vzájomné porovnanie, aby sme mohli vidieť funkčnosť obmedzení z vtáčej perspektívy a ľahko zistiť ich rozdiely:

  • @NotNull: obmedzený CharSequence, Zbierka, Mapa, alebo Pole je platné, pokiaľ nie je neplatné, ale môže byť prázdne
  • @Nie prázdny: obmedzený CharSequence, Zbierka, Mapa, alebo Pole je platné, pokiaľ nie je nulové a jeho veľkosť / dĺžka je väčšia ako nula
  • @NotBlank: obmedzený String je platné, pokiaľ nie je nulové a skrátená dĺžka je väčšia ako nula

7. Záver

V tomto článku sme sa pozreli na NotNull, @Nie prázdnya @NotBlank obmedzenia implementované v Bean Validation a zvýraznili ich podobnosti a rozdiely.

Ako obvykle sú všetky ukážky kódu zobrazené v tomto článku k dispozícii na GitHub.


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