在 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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Validator简介

bean validator - Hibernate validator

spring 项目中使用 hibernate validator验证输入参数

Hibernate Validator注解大全

Hibernate Validator Engine的用法

Hibernate-Validator(数据校验框架)