【问题标题】: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
【问题描述】:

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

【问题讨论】:

    标签: java hibernate validation bean-validation


    【解决方案1】:

    @NotNull:CharSequence、Collection、Map 或 Array 对象不为空,但可以为空。
    @NotEmpty:CharSequence、Collection , Map 或 Array 对象不为空且大小> 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. 字符串名称 = null;
      @NotNull: false
      @NotEmpty: false
      @NotBlank: false

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

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

    4. String name = "好答案!";
      @NotNull: true
      @NotEmpty: true
      @987654352 @:

    【讨论】:

    • 我花了一些时间自己跟踪这些信息,我想帮助其他人从这项工作中受益。 “明确地说,不仅可以提出和回答自己的问题,而且明确鼓励这样做。” blog.stackoverflow.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】:
      1. @NotNull: 受约束的 CharSequence、Collection、Map 或 Array 是 只要不为空就有效,但可以为空
      2. @NotEmpty: 受约束的 CharSequence、集合、映射或数组 只要它不为空并且它的大小/长度更大就有效 大于零。
      3. @NotBlank: 受约束的字符串只要不为空就有效 并且修剪后的长度大于零。

      【讨论】:

        猜你喜欢
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 2021-09-11
        • 2021-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多