W Walidatorze Hibernate 4.1+, jaka jest różnica między @NotNull, @NotEmpty i @NotBlank?

Wydaje mi się, że nie jestem w stanie znaleźć podsumowania, które odróżniałoby różnicę między tymi trzema adnotacjami.

Author: Rick Hanlon II, 2013-06-17

2 answers

@NotNull: obiekt CharSequence, Collection, Map lub Array nie jest null, ale może być pusty.
@NotEmpty: obiekt CharSequence, Collection, Map lub Array nie ma wartości null i rozmiaru > 0.
@NotBlank: łańcuch nie jest null , a długość przycięcia jest większa niż zero .

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

  1. Ograniczenie @NotNull jest zdefiniowany jako:

    @Constraint(validatedBy = {NotNullValidator.class})  
    

    Ta klasa ma metodę isValid zdefiniowaną jako:

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

    @NotNull  
    @Size(min = 1)    
    

    Więc to ograniczenie wykorzystuje ograniczenie @NotNull powyżej, i @Size którego definicja różni się w zależności od przedmiotu, ale powinna być samoistna.

  3. Wreszcie, ograniczenie @NotBlank jest zdefiniowane jako:

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

    Więc to ograniczenie używa również ograniczenia @NotNull, ale także ograniczenia z klasą NotBlankValidator. Ta klasa ma metodę isValid zdefiniowaną jako:

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

    Co ciekawe, metoda ta zwraca true, jeśli łańcuch jest null, ale false wtedy i tylko wtedy, gdy długość przyciętego łańcucha wynosi 0. W porządku, że zwraca true, jeśli jest null, ponieważ, jak wspomniałem, definicja @NotEmpty wymaga również @NotNull.

Oto kilka przykładów:

  1. String name = null;
    @NotNull: fałsz
    @NotEmpty: false
    @NotBlank: false

  2. String name = "";
    @NotNull: prawda
    @NotEmpty: fałsz
    @NotBlank: false

  3. String name = " ";
    @NotNull: prawda
    @NotEmpty: prawda
    @NotBlank: false

  4. String name = " świetna odpowiedź!";
    @NotNull: prawda
    @NotEmpty: prawda
    @NotBlank: prawda

 266
Author: Rick Hanlon II,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 21:11:12

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, pomijając zawartość

@ NotEmpty: sprawdza, czy wartość nie jest null ani pusta. Jeśli ma tylko puste przestrzenie, pozwoli na to jako nie puste.

@ NotBlank: sprawdza, czy wartość nie jest null ani pusta, najpierw przycinając wartość. To znaczy, że nie będzie Zezwalaj tylko na puste przestrzenie.

Więc, jeśli chcesz sprawdzić, czy pole nie jest null, ale także, że nie ma tylko pustych spacji, ale tekstu, powinieneś użyć @NotBlank.

 3
Author: Pratiksha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 17:16:41