notempty notblank annotation java hibernate validation bean-validation

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



@notblank annotation (2)

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 primero el valor. Significa que, no permitirá solo espacios vacíos.

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

Parece que no puedo encontrar un resumen que distinga la diferencia entre estas tres anotaciones.


@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 el tamaño es> 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 llevan a cabo estas restricciones (estoy usando la versión 4.1):

  1. La restricción @NotNull se define como:

    @Constraint(validatedBy = {NotNullValidator.class})

    Esta clase tiene un método isValid definido como:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) { return object != null; }

  2. La restricción @NotEmpty se define como:

    @NotNull @Size(min = 1)

    Por lo tanto, esta restricción usa la restricción @NotNull anterior, y @Size cuya definición difiere en función del objeto, pero debe ser autoexplicativa.

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

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

    Por lo tanto, esta restricción también usa la restricción @NotNull , pero también se restringe con la clase NotBlankValidator. Esta clase tiene un método isValid 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 falsa si y solo si la longitud de la cadena recortada es 0. Está bien que devuelva verdadero si es nulo porque, como mencioné, la definición @NotEmpty también requiere @NotNull .

Aquí están algunos ejemplos:

  1. String name = null;
    @NotNull : falso
    @NotEmpty : falso
    @NotBlank : falso

  2. String name = "";
    @NotNull : true
    @NotEmpty : falso
    @NotBlank : falso

  3. String name = "";
    @NotNull : true
    @NotEmpty : true
    @NotBlank : falso

  4. String name = "¡Excelente respuesta!";
    @NotNull : true
    @NotEmpty : true
    @NotBlank : cierto