124

我似乎无法找到区分这三个注释之间差异的摘要。

4

3 回答 3

339

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

为了帮助您理解,让我们看看这些约束是如何定义和执行的(我使用的是 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. 字符串名称=空;
    @NotNull:假
    @NotEmpty:假
    @NotBlank:假

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

  3. 字符串名称 = " ";
    @NotNull:
    @NotEmpty:
    @NotBlank: 假

  4. String name = "很好的答案!";
    @NotNull:真的
    @NotEmpty:真的
    @NotBlank:真的

于 2013-06-16T20:18:23.150 回答
8

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

@NotNull:检查值是否不为空,忽略内容

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

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

所以,如果你想验证一个字段不是空的,而且它不仅有空格,还有文本,你应该使用@NotBlank。

于 2017-03-06T17:16:41.897 回答
4
  1. @NotNull:受约束的 CharSequence、Collection、Map 或 Array 只要不为 null 就有效,但可以为空
  2. @NotEmpty:受约束的 CharSequence、Collection、Map 或 Array 是有效的,只要它不为 null 并且其大小/长度大于零。
  3. @NotBlank:受约束的字符串只要不为空且修剪长度大于零就有效。
于 2019-07-03T07:32:53.233 回答