Razlika između ograničenja @NotNull, @NotEmpty i @NotBlank u provjeri valjanosti graha

1. Pregled

Provjera graha je standardna specifikacija za provjeru valjanosti koja nam omogućuje jednostavnu provjeru valjanosti objekata domene korištenjem skupa ograničenja deklariranih u obliku bilješki.

Iako je sveukupno, upotreba implementacija provjere graha kao što je Hibernate Validator prilično jednostavna, vrijedi istražiti neke suptilne - ali relevantne - razlike u vezi s načinom na koji se neka od ovih ograničenja provode.

U ovom vodiču, uočit ćemo razlike između @NotNull, @Nije prazno, i @NetBlank ograničenja.

2. Ovisnosti Mavena

Da biste brzo postavili radno okruženje i testirali ponašanje @NotNull, @Nije prazno, i @NetBlank ograničenja, prvo moramo dodati potrebne Mavenove ovisnosti.

U ovom ćemo slučaju za provjeru valjanosti objekata naše domene koristiti Hibernate Validator, referentnu implementaciju graha za provjeru valjanosti.

Evo relevantnog odjeljka našeg pom.xml datoteka:

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

U našim jedinstvenim testovima koristit ćemo JUnit i AssertJ, zato provjerite najnovije verzije hibernate-validatora, EL implementaciju GlassFish-a, junit i assertj-core na Maven Central.

3. The @NotNull Ograničenje

Krećući se naprijed, provedimo naivnost UserNotNull klase domene i ograničite svoj Ime polje s @NotNull napomena:

javna klasa UserNotNull {@NotNull (message = "Ime ne smije biti null") ime privatnog niza; // standardni konstruktori / getteri / toString}

Sada moramo vidjeti kako @NotNull zapravo radi ispod haube.

Da bismo to učinili, izradimo jednostavan jedinični test za klasu i provjerimo nekoliko njegovih primjera:

@BeforeClass javna statička praznina setupValidatorInstance () {validator = Validation.buildDefaultValidatorFactory (). GetValidator (); } @Test public void whenNotNullName_thenNoConstraintViolations () {UserNotNull user = new UserNotNull ("John"); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (0); } @Test public void whenNullName_thenOneConstraintViolation () {UserNotNull user = new UserNotNull (null); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (1); } @Test public void whenEmptyName_thenNoConstraintViolations () {UserNotNull user = new UserNotNull (""); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (0); } 

Očekivano, @NotNull ograničenje neće dopustiti null vrijednosti za ograničena polja. Bez obzira na to, polja mogu biti prazna.

Da bismo ovo bolje razumjeli, pogledajmo NotNullValidator razred isValid () metoda, koja je @NotNull ograničenje koristi. Implementacija metode je doista trivijalna:

javni boolean isValid (objektni objekt) {return objekt! = null; }

Kao što je prikazano gore, polje (npr. CharSequence, Kolekcija, Karta, ili Niz) sputan sa @NotNull ne smije biti null. Međutim, prazna vrijednost je potpuno legalna.

4. The @Nije prazno Ograničenje

Sada, provedimo uzorak UserNotEmpty klasa i koristiti @Nije prazno ograničenje:

javna klasa UserNotEmpty {@NotEmpty (message = "Ime ne smije biti prazno") private String name; // standardni konstruktori / getteri / toString}

S postavljenim razredom, samo ga testirajmo dodijelivši različite vrijednosti znaku Ime polje:

@Test public void whenNotEmptyName_thenNoConstraintViolations () {UserNotEmpty user = new UserNotEmpty ("John"); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (0); } @Test public void whenEmptyName_thenOneConstraintViolation () {UserNotEmpty user = new UserNotEmpty (""); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (1); } @Test public void whenNullName_thenOneConstraintViolation () {UserNotEmpty user = new UserNotEmpty (null); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (1); }

The @Nije prazno napomena koristi @NotNull razred ' isValid () implementacija i dodatno provjerava je li veličina / duljina isporučenog objekta (naravno, ovo varira ovisno o vrsti objekta koji se provjerava) veća od nule.

U suštini, to znači da polje (npr. CharSequence, Kolekcija, Karta, ili Niz) sputan sa @Nije prazno ne smije biti null i njegova veličina / duljina mora biti veća od nule.

Uz to, možemo biti još restriktivniji ako koristimo @Nije prazno bilješka u vezi s @Veličina.

Pritom bismo također prisilili da su vrijednosti min i max veličine objekta unutar navedenog min / max raspona:

@NotEmpty (message = "Ime ne smije biti prazno") @Size (min = 2, max = 32, message = "Ime mora biti između 2 i 32 znaka") ime privatnog niza; 

5. The @NetBlank Ograničenje

Slično tome, polje klase možemo ograničiti s @NetBlank napomena:

javna klasa UserNotBlank {@NotBlank (message = "Ime ne smije biti prazno") ime privatnog niza; // standardni konstruktori / getteri / toString}

U skladu s istim linijama, možemo provesti jedinstveni test kako bismo razumjeli kako @NetBlank ograničenja rade:

@Test public void whenNotBlankName_thenNoConstraintViolations () {UserNotBlank user = new UserNotBlank ("John"); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (0); } @Test public void whenBlankName_thenOneConstraintViolation () {UserNotBlank user = new UserNotBlank (""); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (1); } @Test public void whenEmptyName_thenOneConstraintViolation () {UserNotBlank user = new UserNotBlank (""); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (1); } @Test public void whenNullName_thenOneConstraintViolation () {UserNotBlank user = new UserNotBlank (null); Postavi kršenja = validator.validate (korisnik); assertThat (нарушения.size ()). isEqualTo (1); } 

The @NetBlank bilješka koristi NotBlankValidator klasa, koja provjerava da obrezana duljina niza znakova nije prazna:

javni boolean isValid (CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) if (charSequence == null) {return true; } return charSequence.toString (). trim (). length ()> 0; } 

Smiješno, metoda vraća true za null vrijednosti. Dakle, mogli bismo to pomisliti @NetBlank dopušta null vrijednosti, ali zapravo ne.

The @NotNull klasa 'isValid () metoda poziva se nakon @NetBlank class 'isValid (), pa zabranjuje null vrijednosti.

Jednostavno rečeno, a Niz polje ograničeno sa @NetBlank ne smije biti null, a obrezana duljina mora biti veća od nule.

6. Usporedna usporedba

Do sada smo detaljno pogledali kako @NotNull, @Nije prazno, i @NetBlank ograničenja djeluju pojedinačno na poljima razreda.

Izvršimo brzu usporednu usporedbu kako bismo imali ptičji pogled na funkcionalnost ograničenja i lako uočili njihove razlike:

  • @NotNull: sputan CharSequence, Kolekcija, Karta, ili Polje vrijedi sve dok nije null, ali može biti prazno
  • @Nije prazno: sputan CharSequence, Kolekcija, Karta, ili Polje vrijedi sve dok nije null i njegova je veličina / duljina veća od nule
  • @NotBlank: sputan Niz vrijedi sve dok nije null i obrezana duljina veća od nule

7. Zaključak

U ovom smo članku pogledali NotNull, @Nije prazno, i @NetBlank ograničenja primijenjena u provjeri valjanosti zrna i naglasile njihove sličnosti i razlike.

Kao i obično, svi uzorci koda prikazani u ovom članku dostupni su na GitHubu.