web-dev-qa-db-fra.com

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

Je n'arrive pas à trouver un résumé qui distingue la différence entre ces trois annotations.

107
Rick Hanlon II

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

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

  1. Le @NotNull contrainte est définie comme:

    @Constraint(validatedBy = {NotNullValidator.class})  
    

    Cette classe a une méthode isValid définie comme suit:

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

    @NotNull  
    @Size(min = 1)    
    

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

  3. Finalement, le @NotBlank contrainte est définie comme:

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

    Donc, cette contrainte utilise aussi le @NotNull contrainte, mais aussi contrainte avec la classe NotBlankValidator. Cette classe a une méthode isValid définie comme suit:

    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 null, mais false si et seulement si la longueur de la chaîne tronquée est 0. Il est normal qu'elle renvoie true si elle est null car, comme je l'ai mentionné, le @NotEmpty La définition nécessite également @NotNull.

Voici quelques exemples:

  1. Nom de 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 = "Bonne réponse!";
    @NotNull: vrai
    @NotEmpty: vrai
    @NotBlank: vrai

297
Rick Hanlon II

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 null, en ignorant le contenu

@NotEmpty: Vérifie si la valeur n'est ni nulle ni vide. S'il ne contient que des espaces vides, il sera autorisé à ne pas être vide.

@NotBlank: Vérifie si la valeur n'est ni nulle ni vide, 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 qu’il n’a pas que des espaces vides, mais du texte, vous devez utiliser @NotBlank.

7
Pratiksha
  1. @NotNull: une séquence, une collection, une mappe ou un tableau contraint est valide tant qu’il n’est pas nul, mais peut être vide
  2. @NotEmpty: une séquence, une collection, une carte ou un tableau sous contrainte est valide tant qu’il n’est pas nul 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 ajustée est supérieure à zéro.
1
Mukesh Kumar Gupta