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):
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; }
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.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étodoisValid
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:
String name = null;
@NotNull
: falso
@NotEmpty
: falso
@NotBlank
: falsoString name = "";
@NotNull
: true
@NotEmpty
: falso
@NotBlank
: falsoString name = "";
@NotNull
: true
@NotEmpty
: true
@NotBlank
: falsoString name = "¡Excelente respuesta!";
@NotNull
: true
@NotEmpty
: true
@NotBlank
: cierto