Dans Hibernate Validator 4.1+, quelle est la différence entre @NotNull, @NotEmpty et @NotBlank?

Réponses:

314

@NotNull: L'objet CharSequence, Collection, Map ou Array n'est pas nul , mais peut être vide.
@NotEmpty: L'objet CharSequence, Collection, Map ou Array n'est pas nul et taille> 0 .
@NotBlank: La chaîne n'est pas nulle et la longueur découpée est supérieure à zéro .

Pour vous aider à comprendre, regardons comment ces contraintes sont définies et exécutées (j'utilise la version 4.1):

  1. La @NotNullcontrainte est définie comme:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Cette classe a une isValidméthode définie comme:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
    
  2. La @NotEmptycontrainte est définie comme:

    @NotNull  
    @Size(min = 1)    
    

    Donc, cette contrainte utilise la @NotNullcontrainte ci-dessus, et @Size dont la définition diffère en fonction de l'objet mais doit être explicite.

  3. Enfin, la @NotBlankcontrainte est définie comme:

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

    Donc, cette contrainte utilise également la @NotNullcontrainte, mais aussi des contraintes avec la classe NotBlankValidator. Cette classe a une isValidméthode définie comme:

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

    Fait intéressant, cette méthode retourne true si la chaîne est nulle, mais false si et seulement si la longueur de la chaîne coupée est 0. Il est normal qu'elle retourne true si elle est nulle car, comme je l'ai mentionné, la @NotEmptydéfinition l'exige également @NotNull.

Voici quelques exemples:

  1. Nom de la chaîne = null;
    @NotNull: faux
    @NotEmpty: faux
    @NotBlank: faux

  2. Nom de la chaîne = "";
    @NotNull: vrai
    @NotEmpty : faux
    @NotBlank: faux

  3. Nom de la chaîne = "";
    @NotNull: vrai
    @NotEmpty : vrai
    @NotBlank : faux

  4. String name = "Excellente réponse!";
    @NotNull: vrai
    @NotEmpty : vrai
    @NotBlank : vrai

Rick Hanlon II
la source
29
J'ai passé un certain temps à suivre ces informations par moi-même et je voulais aider les autres à profiter de cet effort. "Pour être clair comme de l'eau de roche, il n'est pas simplement acceptable de poser et de répondre à votre propre question, cela est explicitement encouragé." blog.stackoverflow.com/2011/07/…
Rick Hanlon II
4
À mon avis, @NotBlank DEVRAIT accepter null. Dans certains cas, vous accepteriez null pour les champs facultatifs où le blanc est tout simplement invalide.
tbraun
1
Je suis d'accord avec ça. Si vous ne voulez ni null ni vide, vous pouvez utiliser les deux. Comme ce n'est pas le cas, vous pouvez écrire votre propre validateur et l'utiliser comme prévu.
Rick Hanlon II
1
Juste une note: @NotNull peut être utilisé avec n'importe quel objet, pas seulement "CharSequence, Collection, Map ou Array"; comme le montre d'ailleurs le code que vous avez inséré au point 1.
Niccolò
@RickHanlonII Pourriez-vous suggérer comment cela est-il validé dans Hibernate Validator 5+. Il ne semble pas y avoir ConstraintValidatorassocié à ces annotations plus longtemps .
Steve
7

J'ai aimé l'explication dans le lien ci-dessous: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: vérifie si la valeur n'est pas nulle, sans tenir compte du contenu

@NotEmpty: vérifie si la valeur n'est ni nulle ni vide. S'il ne contient que des espaces vides, il l'autorisera comme non vide.

@NotBlank: vérifie si la valeur n'est ni nulle ni vide, en coupant d'abord la valeur. Cela signifie que cela ne permettra pas que des espaces vides.

Donc, si vous voulez valider qu'un champ n'est pas nul mais aussi qu'il ne contient pas que des espaces vides, mais du texte, vous devez utiliser @NotBlank.

Pratiksha
la source
1
  1. @NotNull: un CharSequence, Collection, Map ou Array contraint est valide tant qu'il n'est pas nul, mais il peut être vide
  2. @NotEmpty: une CharSequence, Collection, Map ou Array contrainte est valide tant qu'elle n'est pas nulle et que sa taille / longueur est supérieure à zéro.
  3. @NotBlank: une chaîne contrainte est valide tant qu'elle n'est pas nulle et que la longueur tronquée est supérieure à zéro.
Mukesh Kumar Gupta
la source