我似乎无法找到区分这三个注释之间差异的摘要。
3 回答
@NotNull
: CharSequence、Collection、Map 或 Array 对象不为 null,但可以为空。
@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 是可以的,因为正如我所提到的,
@NotEmpty
定义还需要@NotNull
.
这里有一些例子:
字符串名称=空;
@NotNull
:假
@NotEmpty
:假
@NotBlank
:假字符串名称 = "";
@NotNull
:真
@NotEmpty
: 假
@NotBlank
: 假字符串名称 = " ";
@NotNull
:真
@NotEmpty
:真
@NotBlank
: 假String name = "很好的答案!";
@NotNull
:真的
@NotEmpty
:真的
@NotBlank
:真的
我喜欢下面链接中的解释: http ://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull:检查值是否不为空,忽略内容
@NotEmpty:检查值是否不为空也不为空。如果它只有空格,它将允许它不为空。
@NotBlank:检查值是否不为空或不为空,首先修剪该值。这意味着,它不会只允许空格。
所以,如果你想验证一个字段不是空的,而且它不仅有空格,还有文本,你应该使用@NotBlank。
@NotNull:
受约束的 CharSequence、Collection、Map 或 Array 只要不为 null 就有效,但可以为空@NotEmpty:
受约束的 CharSequence、Collection、Map 或 Array 是有效的,只要它不为 null 并且其大小/长度大于零。@NotBlank:
受约束的字符串只要不为空且修剪长度大于零就有效。