【问题标题】:JSF/Hibernate NotBlank validationJSF/Hibernate NotBlank 验证
【发布时间】:2011-03-16 23:31:50
【问题描述】:

我有一个简单的 JSF+RichFaces 表单,其中包含一些字段,显然还有一个支持 bean 来存储它们。在该 bean 中,所有必要的属性都有验证注释(jsr303/hibernate),但我似乎找不到一个注释来检查属性(字符串)是否为空。我知道 spring 模块中有一个 @NotBlank 注释,但是 JSF 不支持 spring 验证。有什么简单的方法可以检查它还是我应该自己写注释?

@Edit:我已经在 jsr303 和 hibernate 中尝试过 @NotNull 和 @NotEmpty,但它们都失败了,我仍然可以发送一个空白字符串,如“”。

【问题讨论】:

    标签: java validation jsf richfaces bean-validation


    【解决方案1】:

    也许是@NotEmpty

    定义为:

    @NotNull
    @Size(min=1)
    

    既然你用的是richfaces,我猜你用的是<rich:beanValidator />?它处理 JSR 303 注释。

    更新:试试(取自here):

    @Pattern(regex="(?!^[\s]*$)"). 
    

    【讨论】:

    • @NotEmpty 允许带有空格的字符串,即 " " 被认为是有效的。
    【解决方案2】:

    如果您使用 Hibernate Validator 4.1 作为您的 JSR-303 实现,它们会提供一个 @NotBlank 注释,该注释完全符合您的要求,与 @NotNull 和 @NotEmpty 分开。您需要使用(当前)最新版本,但这可以工作。

    如果你因为某种原因不能到最新版本,自己写一个注解也不需要太多。

    【讨论】:

      【解决方案3】:

      Hibernate Validator 4.1+ 提供了一个自定义的纯字符串 @NotBlank 注释,用于在修剪空格后检查非空和非空@NotBlank 的 api 文档状态:

      与 NotEmpty 的区别在于尾随空格会被忽略。

      如果不清楚@NotEmpty是在检查前对String进行修整,先看4.1文档中'built-in constaints'表下给出的描述:

      检查带注释的字符串不为空且修剪后的长度大于0。与@NotEmpty 的不同之处在于该约束只能应用于字符串,并且忽略尾随空格。

      然后,浏览代码,你会看到@NotBlankdefined as

      @Documented
      @Constraint(validatedBy=NotBlankValidator.class)
      @Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
      @Retention(value=RUNTIME)
      @NotNull
      public @interface NotBlank{
        /* ommited */
      }
      

      在这个定义中有两点需要注意。首先是@NotBlank的定义包含@NotNull,所以是@NotNull的扩展。第二个是它通过使用带有 NotBlankValidator.class 的@Constraint 扩展@NotNull。这个类有一个isValid 方法,它是:

      public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
        if ( charSequence == null ) { //this is curious
          return true;
        }
          return charSequence.toString().trim().length() > 0; //dat trim
      }
      

      有趣的是,如果字符串为 null,则此方法返回 true,但当且仅当修剪字符串的长度为 0 时返回 false。如果它为 null,则返回 true 是可以的,因为正如我所提到的,@NotEmpty 定义也需要@NotNull。

      【讨论】:

      • 谢谢,这帮助我编写了自定义验证器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2011-01-29
      相关资源
      最近更新 更多