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

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


答案 1

@NotNull:字符序列、集合、映射或数组对象不为空,但可以为空。
:字符序列、集合、映射或数组对象不为空,大小> 0
:字符串不为空,并且修剪后的长度大于零@NotEmpty@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})        
    

    因此,此约束也使用约束,但也使用 NotBlankValidator 类的约束。此类具有定义为以下方法的方法:@NotNullisValid

    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. 字符串名称 = “伟大的答案!”;


    真: 真@NotNull@NotEmpty@NotBlank


答案 2

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

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

@NotEmpty:检查该值是否为空或为空。如果它只有空的空间,它将允许它为非空。

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

因此,如果要验证某个字段是否不为 null,但要验证它是否只有空格,而是文本,则应使用@NotBlank。


推荐