在 Hibernate Validator 4.1+ 中,@NotNull、@NotEmpty 和 @NotBlank 有啥区别?
Posted
技术标签:
【中文标题】在 Hibernate Validator 4.1+ 中,@NotNull、@NotEmpty 和 @NotBlank 有啥区别?【英文标题】:In Hibernate Validator 4.1+, what is the difference between @NotNull, @NotEmpty, and @NotBlank?在 Hibernate Validator 4.1+ 中,@NotNull、@NotEmpty 和 @NotBlank 有什么区别? 【发布时间】:2013-06-12 19:17:54 【问题描述】:我似乎无法找到区分这三个注释之间差异的摘要。
【问题讨论】:
【参考方案1】:@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 @:真
【讨论】:
我花了一些时间自己跟踪这些信息,我想帮助其他人从这项工作中受益。 “明确地说,不仅可以提出和回答自己的问题,而且明确鼓励这样做。” blog.***.com/2011/07/… 在我看来,@NotBlank 应该接受 null。在某些情况下,您会为空白无效的可选字段接受 null。 我同意这一点。如果您不希望为空且不为空,则可以同时使用两者。由于情况并非如此,您可以编写自己的验证器并按预期使用它。 请注意:@NotNull 可以与任何对象一起使用,而不仅仅是“CharSequence、Collection、Map 或 Array”;正如您在第 1 点中插入的代码所示。 @RickHanlonII 您能否建议它如何在 Hibernate Validator 5+ 中得到验证。似乎没有任何ConstraintValidator
与这些注释 any longer 关联。【参考方案2】:
我喜欢下面链接中的解释: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/
@NotNull:检查值是否不为空,忽略内容
@NotEmpty:检查值是否不为空或不为空。如果它只有空格,它将允许它不为空。
@NotBlank:检查值是否不为空或不为空,先修整值。这意味着,它不会只允许空格。
所以,如果你想验证一个字段不为空,而且它不仅有空格,还有文本,你应该使用@NotBlank。
【讨论】:
【参考方案3】:@NotNull:
受约束的 CharSequence、Collection、Map 或 Array 是
只要不为空就有效,但可以为空
@NotEmpty:
受约束的 CharSequence、集合、映射或数组
只要它不为空并且它的大小/长度更大就有效
大于零。
@NotBlank:
受约束的字符串只要不为空就有效
并且修剪后的长度大于零。
【讨论】:
以上是关于在 Hibernate Validator 4.1+ 中,@NotNull、@NotEmpty 和 @NotBlank 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
bean validator - Hibernate validator