我似乎无法找到区分这三个注释之间差异的摘要。
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:受约束的字符串只要不为空且修剪长度大于零就有效。