我似乎无法找到区分这三个注释之间差异的摘要。
答案 0 :(得分:287)
@NotNull
:CharSequence,Collection,Map或Array对象不为空,但可以为空。
@NotEmpty
:CharSequence,Collection,Map或Array对象不为null 和size> 0 即可。
@NotBlank
:字符串不为空且修剪长度大于零。
为了帮助您理解,我们来看看如何定义和执行这些约束(我使用的是4.1版):
@NotNull
约束定义为:
@Constraint(validatedBy = {NotNullValidator.class})
此类的isValid
方法定义为:
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
return object != null;
}
@NotEmpty
约束定义为:
@NotNull
@Size(min = 1)
因此,此约束使用上面的@NotNull
约束,和 @Size
,其定义因对象而异,但应该是自我解释的。
最后,@NotBlank
约束定义为:
@NotNull
@Constraint(validatedBy = {NotBlankValidator.class})
因此,此约束也使用@NotNull
约束,但也使用NotBlankValidator类进行约束。此类的isValid
方法定义为:
if ( charSequence == null ) { //curious
return true;
}
return charSequence.toString().trim().length() > 0;
有趣的是,如果字符串为null,则此方法返回true,但当且仅当修剪字符串的长度为0时才返回false。如果它为null,则返回true,因为正如我所提到的那样{{1} } definition也需要@NotEmpty
。
以下是一些例子:
String name = null;
@NotNull
:false
@NotNull
:false
@NotEmpty
:false
String name =“”;
@NotBlank
: true
@NotNull
:false
@NotEmpty
:false
String name =“”;
@NotBlank
: true
@NotNull
: true
@NotEmpty
:false
String name =“很棒的答案!”;
@NotBlank
: true
@NotNull
: true
@NotEmpty
: true
答案 1 :(得分:7)
我喜欢以下链接中的解释: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull:检查值是否为空,忽略内容
@NotEmpty:检查该值是否为空,也不为空。如果它只有空格,则允许它不为空。
@NotBlank:检查值是否为空还是空,首先修剪该值。这意味着,它不会只允许空格。
因此,如果你想验证一个字段不是null,而且它不只有空格而是文本,你应该使用@NotBlank。
答案 2 :(得分:0)
@NotNull:
受约束的CharSequence,Collection,Map或Array为
只要不为空就有效,但可以为空@NotEmpty:
受约束的CharSequence,Collection,Map或Array
只要不为null并且大小/长度更大,就有效
大于零。@NotBlank:
受约束的字符串只要不为空就有效
并且修剪后的长度大于零。