首页 文章

JSF / Hibernate NotBlank验证

提问于
浏览
0

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

@Edit:我已经尝试过来自jsr303和hibernate的@NotNull和@NotEmpty,但是他们都失败了我仍然可以发送一个像“”这样的空白字符串 .

3 回答

  • 9

    如果你使用Hibernate Validator 4.1作为你的JSR-303实现,那么它们提供了一个@NotBlank注释,它完全可以完成你正在寻找的东西,与@NotNull和@NotEmpty分开 . 您需要使用(当前)最新版本,但这将有效 .

    如果由于某种原因无法使用最新版本,那么自己编写注释并不需要太多 .

  • 0

    Hibernate Validator 4.1提供了一个自定义的仅字符串@NotBlank注释,它在修剪空格后检查非空而不是空 . @NotBlank 的api文档指出:

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

    如果不清楚 @NotEmpty 在检查之前修剪字符串,请首先查看表'built-in constaints'下4.1文档中给出的描述:

    检查带注释的字符串是否为空并且修剪长度大于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 .

  • 1

    也许@NotEmpty

    其定义为:

    @NotNull
    @Size(min=1)
    

    由于你使用的是richfaces,我想你正在使用<rich:beanValidator />?它处理JSR 303注释 .

    Update :尝试(取自here):

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

相关问题