【发布时间】:2013-06-12 19:17:54
【问题描述】:
我似乎无法找到区分这三个注释之间差异的摘要。
【问题讨论】:
标签: java hibernate validation bean-validation
我似乎无法找到区分这三个注释之间差异的摘要。
【问题讨论】:
标签: java hibernate validation bean-validation
@NotNull:CharSequence、Collection、Map 或 Array 对象不为空,但可以为空。@NotEmpty:CharSequence、Collection , Map 或 Array 对象不为空且大小> 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。
这里有几个例子:
字符串名称 = null;@NotNull: false@NotEmpty: false@NotBlank: false
字符串名称 = "";@NotNull: true@NotEmpty: false@NotBlank: false
字符串名称 = " ";@NotNull: true@NotEmpty: true@NotBlank: false
String name = "好答案!";@NotNull: true@NotEmpty: true
@987654352 @:真
【讨论】:
ConstraintValidator 与这些注释 any longer 关联。
我喜欢下面链接中的解释: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull:检查值是否不为空,忽略内容
@NotEmpty:检查值是否不为空或不为空。如果它只有空格,它将允许它不为空。
@NotBlank:检查值是否不为空或不为空,先修整值。这意味着,它不会只允许空格。
所以,如果你想验证一个字段不为空,而且它不仅有空格,还有文本,你应该使用@NotBlank。
【讨论】:
@NotNull: 受约束的 CharSequence、Collection、Map 或 Array 是
只要不为空就有效,但可以为空@NotEmpty: 受约束的 CharSequence、集合、映射或数组
只要它不为空并且它的大小/长度更大就有效
大于零。@NotBlank: 受约束的字符串只要不为空就有效
并且修剪后的长度大于零。【讨论】: