En Hibernate Validator 4.1+, ¿cuál es la diferencia entre @NotNull, @NotEmpty y @NotBlank?

Respuestas:

314

@NotNull: El objeto CharSequence, Collection, Map o Array no es nulo , pero puede estar vacío.
@NotEmpty: El objeto CharSequence, Collection, Map o Array no es nulo y tiene un tamaño> 0 .
@NotBlank: La cadena no es nula y la longitud recortada es mayor que cero .

Para ayudarlo a comprender, veamos cómo se definen y ejecutan estas restricciones (estoy usando la versión 4.1):

  1. La @NotNullrestricción se define como:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Esta clase tiene un isValidmétodo definido como:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. La @NotEmptyrestricción se define como:

    @NotNull  
    @Size(min = 1)    

    Entonces, esta restricción usa la @NotNullrestricción anterior, y @Size cuya definición difiere según el objeto, pero debe explicarse por sí misma.

  3. Finalmente, la @NotBlankrestricción se define como:

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

    Entonces, esta restricción también usa la @NotNullrestricción, pero también restringe con la clase NotBlankValidator. Esta clase tiene un isValidmétodo definido como:

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

    Curiosamente, este método devuelve verdadero si la cadena es nula, pero falso si y solo si la longitud de la cadena recortada es 0. Está bien que devuelva verdadero si es nulo porque, como mencioné, la @NotEmptydefinición también requiere @NotNull.

Aquí están algunos ejemplos:

  1. Nombre de cadena = nulo;
    @NotNull: falso
    @NotEmpty: falso
    @NotBlank: falso

  2. Nombre de cadena = "";
    @NotNull: verdadero
    @NotEmpty : falso
    @NotBlank: falso

  3. Nombre de cadena = "";
    @NotNull: verdadero
    @NotEmpty : verdadero
    @NotBlank : falso

  4. String name = "¡Gran respuesta!";
    @NotNull: verdadero
    @NotEmpty : verdadero
    @NotBlank : verdadero

Rick Hanlon II
fuente
29
Pasé algún tiempo rastreando esta información por mi cuenta y quería ayudar a otros a beneficiarse de ese esfuerzo. "Para ser claro como el cristal, no está simplemente bien hacer y responder su propia pregunta, se recomienda explícitamente". blog.stackoverflow.com/2011/07/…
Rick Hanlon II
4
En mi opinión, @NotBlank DEBE aceptar null. Hay algunos casos en los que aceptaría un valor nulo para los campos opcionales en los que el espacio en blanco no es válido.
tbraun
1
Estoy de acuerdo con eso. Si desea que no sea nulo ni vacío, puede usar ambos. Dado que ese no es el caso, puede escribir su propio validador y usarlo como espera.
Rick Hanlon II
1
Solo una nota: @NotNull se puede usar con cualquier objeto, no solo con "CharSequence, Collection, Map o Array"; como muestra el código que insertó en el punto 1.
Niccolò
@RickHanlonII ¿Podría sugerir cómo se valida en Hibernate Validator 5+? No parecía que le hace a cualquier ser ConstraintValidatorasociado con estas anotaciones por más tiempo .
Steve
7

Me gustó la explicación en el siguiente enlace: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: Comprueba si el valor no es nulo, sin tener en cuenta el contenido.

@NotEmpty: comprueba si el valor no es nulo ni está vacío. Si solo tiene espacios vacíos, lo permitirá como no vacío.

@NotBlank: comprueba si el valor no es nulo ni está vacío, recortando el valor primero. Significa que no permitirá solo espacios vacíos.

Entonces, si desea validar que un campo no es nulo pero también que no solo tiene espacios vacíos, sino texto, debe usar @NotBlank.

Pratiksha
fuente
1
  1. @NotNull: una CharSequence, Collection, Map o Array restringida es válida siempre que no sea nula, pero puede estar vacía
  2. @NotEmpty: una CharSequence, Collection, Map o Array restringida es válida siempre que no sea nula y su tamaño / longitud sea mayor que cero.
  3. @NotBlank: una cadena restringida es válida siempre que no sea nula y la longitud recortada sea mayor que cero.
Mukesh Kumar Gupta
fuente