代码之家  ›  专栏  ›  技术社区  ›  Mateusz Dymczyk

JSF/Hibernate Notblank验证

  •  0
  • Mateusz Dymczyk  · 技术社区  · 15 年前

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

    @编辑:我已经尝试了jsr303和hibernate中的@notnull和@notempty,但它们都失败了,我仍然可以发送类似“”的空白字符串。

    3 回复  |  直到 12 年前
        1
  •  9
  •   GaryF    15 年前

    如果您使用Hibernate验证程序4.1作为JSR-303实现,它们提供了 @NotBlank 与@notnull和@notempty完全不同的注释。您需要使用(当前)最新版本,但这将起作用。

    如果出于某种原因不能使用最新版本,那么自己编写注释就不需要太多。

        2
  •  1
  •   Rick Hanlon II    12 年前

    Hibernate验证程序4.1+仅提供自定义字符串 @NotBlank 检查非空和非空的批注 在修剪空白之后 . API文档 @空白 国家:

    与notEmpty不同的是尾随空格会被忽略。

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

    检查注释字符串是否不为空,修剪后的长度是否大于0。与@notempty的不同之处在于,此约束只能应用于字符串,后面的空格将被忽略。

    然后,浏览代码,您将看到 @空白 defined as :

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

    在这个定义中有两件事需要注意。第一个是对 @空白 包括 @NotNull ,所以它是 @ NotNull . 第二个是它延伸 @ NotNull 通过使用 @Constraint 使用NotBlankValidator.Class。这个班有一个 isValid 方法是:

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

    有趣的是,如果字符串为空,则此方法返回true;如果且仅当修剪后的字符串的长度为0,则返回false。如果它为空,则返回true是可以的,因为正如我提到的,@notempty定义还需要@notnull。

        3
  •  0
  •   Bozho    15 年前

    也许 @NotEmpty ?

    定义如下:

    @NotNull
    @Size(min=1)
    

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

    更新 :尝试(取自 here ):

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