Jaka jest różnica między @NotNull, @NotEmpty i @NotBlank w Hibernate Validator 4.1+?


Odpowiedzi:


314

@NotNull: Obiekt CharSequence, Collection, Map lub Array nie ma wartości NULL , ale może być pusty.
@NotEmpty: Obiekt CharSequence, Collection, Map lub Array nie ma wartości NULL i ma rozmiar> 0 .
@NotBlank: Ciąg nie jest pusty, a przycięta długość jest większa od zera .

Aby pomóc Ci zrozumieć, przyjrzyjmy się, jak te ograniczenia są definiowane i wykonywane (używam wersji 4.1):

  1. @NotNullOgraniczeniem jest zdefiniowany jako:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Ta klasa ma isValidmetodę zdefiniowaną jako:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
    
  2. @NotEmptyOgraniczeniem jest zdefiniowany jako:

    @NotNull  
    @Size(min = 1)    
    

    Więc to ograniczenie stosuje się @NotNullograniczenie powyżej, a @Size którego definicja różni się w zależności od obiektu, ale powinna być jasna explanitory.

  3. Ostatecznie @NotBlankograniczenie definiuje się jako:

    @NotNull  
    @Constraint(validatedBy = {NotBlankValidator.class})        
    

    Więc to ograniczenie również używa @NotNullograniczenia, ale także ogranicza się z klasą NotBlankValidator. Ta klasa ma isValidmetodę zdefiniowaną jako:

    if ( charSequence == null ) {  //curious 
      return true;   
    }   
    return charSequence.toString().trim().length() > 0;  
    

    Co ciekawe, ta metoda zwraca prawdę, jeśli ciąg jest pusty, ale fałsz wtedy i tylko wtedy, gdy długość przyciętego ciągu wynosi 0. W porządku, że zwraca wartość true, jeśli jest pusty, ponieważ, jak wspomniałem, @NotEmptydefinicja również wymaga @NotNull.

Oto kilka przykładów:

  1. Nazwa ciągu = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. Nazwa ciągu = "";
    @NotNull: prawda
    @NotEmpty : fałsz
    @NotBlank: fałsz

  3. Nazwa ciągu = "";
    @NotNull: prawda
    @NotEmpty : prawda
    @NotBlank : fałsz

  4. Nazwa ciągu = "Świetna odpowiedź!";
    @NotNull: prawda
    @NotEmpty : prawda
    @NotBlank : prawda


29
Spędziłem trochę czasu na samodzielnym śledzeniu tych informacji i chciałem pomóc innym czerpać korzyści z tego wysiłku. „Aby być jasnym, zadawanie pytań i odpowiadanie na nie jest nie tylko w porządku, jest to wyraźnie zalecane”. blog.stackoverflow.com/2011/07/…
Rick Hanlon II

4
Moim zdaniem @NotBlank POWINIEN akceptować null. W niektórych przypadkach można zaakceptować wartość null dla pól opcjonalnych, w których puste jest po prostu nieprawidłowe.
tbraun

1
Zgodziłbym się z tym. Jeśli chcesz, aby nie były puste ani puste, możesz użyć obu. Ponieważ tak nie jest, możesz napisać własny walidator i używać go zgodnie z oczekiwaniami.
Rick Hanlon II

1
Uwaga: @NotNull można używać z dowolnym obiektem, a nie tylko „CharSequence, Collection, Map lub Array”; jak rzeczywiście pokazuje kod wstawiony w punkcie 1.
Niccolò

@RickHanlonII Czy można zasugerować, w jaki sposób jest sprawdzany w Hibernate Validator 5+. Wygląda na to, że żadne ConstraintValidatoradnotacje nie są już powiązane .
Steve

7

Podobało mi się wyjaśnienie w poniższym linku: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: sprawdza, czy wartość nie jest null, ignorując zawartość

@NotEmpty: sprawdza, czy wartość nie jest zerowa ani pusta. Jeśli ma tylko puste spacje, pozwoli to jako niepuste.

@NotBlank: sprawdza, czy wartość nie jest zerowa ani pusta, najpierw przycinając wartość. Oznacza to, że nie pozwoli tylko na puste przestrzenie.

Tak więc, jeśli chcesz sprawdzić, czy pole nie jest puste, ale także że zawiera nie tylko puste spacje, ale tekst, powinieneś użyć @NotBlank.


1
  1. @NotNull: ograniczona CharSequence, Collection, Map lub Array jest ważna, o ile nie ma wartości null, ale może być pusta
  2. @NotEmpty: ograniczona CharSequence, Collection, Map lub Array jest prawidłowa, o ile nie ma wartości null, a jej rozmiar / długość jest większa niż zero.
  3. @NotBlank: ograniczony String jest ważny, o ile nie jest null, a przycięta długość jest większa od zera.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.