JSF / Hibernate NotBlank验证

时间:2010-07-16 13:49:49

标签: java validation jsf richfaces bean-validation

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

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

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的@NotNull来扩展@Constraint。这个类有一个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,因为正如我所提到的,@ NotTmpty定义也是需要@NotNull。

答案 2 :(得分:0)

也许是@NotEmpty

定义为:

@NotNull
@Size(min=1)

由于您使用的是richfaces,我猜您使用的是<rich:beanValidator />?它处理JSR 303注释。

更新:尝试(取自here):

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