在Hibernate Validator 4.1+中,@ NotNull,@ NotEmpty和@NotBlank有什么区别?


Answers:


314

@NotNull:CharSequence,Collection,Map或Array对象不为null,但可以为空。
@NotEmpty:CharSequence,Collection,Map或Array对象不为null,并且size> 0
@NotBlank:字符串不为null ,并且修剪后的长度大于零

为了帮助您理解,让我们研究一下如何定义和执行这些约束(我使用的是4.1版):

  1. @NotNull约束被定义为:

    @Constraint(validatedBy = {NotNullValidator.class})  

    此类的isValid方法定义为:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. @NotEmpty约束被定义为:

    @NotNull  
    @Size(min = 1)    

    因此,此约束使用@NotNull上面的约束,并且 @Size其定义因对象而异,但应该是自说明的。

  3. 最后,@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

这里有一些例子:

  1. 字符串名称= null;
    @NotNull:错误
    @NotEmpty:错误
    @NotBlank:错误

  2. 字符串名称=“”;
    @NotNull
    @NotEmpty:假
    @NotBlank:假

  3. 字符串名称=“”;
    @NotNulltrue
    @NotEmptytrue
    @NotBlank:false

  4. 字符串名称=“好答案!”;
    @NotNulltrue
    @NotEmptytrue
    @NotBlanktrue


29
我花了一些时间自己跟踪信息,我想帮助其他人从这项工作中受益。“明确地说,不仅要问和回答自己的问题,还应鼓励这样做。” blog.stackoverflow.com/2011/07/…–
里克·汉隆二世

4
我认为@NotBlank应该接受null。在某些情况下,对于空白无效的可选字段,您可能会接受null。
tbraun

1
我同意这一点。如果您不希望为null也不为空,则可以同时使用两者。既然不是这种情况,您可以编写自己的验证器并按预期使用它。
里克·汉隆

1
请注意:@NotNull可以与任何对象一起使用,而不仅仅是“ CharSequence,Collection,Map或Array”;正如您在第1点插入的代码所示。
尼可罗马基

@RickHanlonII您能否建议如何在Hibernate Validator 5+中对其进行验证。似乎不再ConstraintValidator与这些注释相关联。
史蒂夫(Steve)

7

我喜欢以下链接中的解释:http : //www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull:不考虑内容而检查值是否不为null

@NotEmpty:检查该值是否不为null也不为空。如果只有空格,它将允许它不为空。

@NotBlank:检查该值是否不为null也不为空,首先修剪该值。这意味着,它不会只允许有空格。

因此,如果要验证字段不是空值,而且还不只是空白,而是文本,则应使用@NotBlank。


1
  1. @NotNull: 受约束的CharSequence,Collection,Map或Array有效,只要它不为null,但可以为空
  2. @NotEmpty: 受约束的CharSequence,Collection,Map或Array有效,只要它不为null且其大小/长度大于零即可。
  3. @NotBlank: 受约束的字符串有效,只要它不为null且修剪后的长度大于零即可。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.