Java JSF/Hibernate非空验证

Java JSF/Hibernate非空验证,java,validation,jsf,richfaces,bean-validation,Java,Validation,Jsf,Richfaces,Bean Validation,我有一个简单的JSF+RichFaces表单,其中包含一些字段,显然还有一个用于存储这些字段的支持bean。在这个bean中,所有必要的属性都有验证注释(jsr303/hibernate),但是我似乎找不到一个可以检查属性(字符串)是否为空的注释。我知道spring模块中有@NotBlank注释,但JSF不支持spring验证。有什么简单的方法可以检查它吗?或者我应该自己写注释吗 @编辑:我已经从jsr303和hibernate中尝试了@NotNull和@NotEmpty,但都失败了。我仍然可以

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

@编辑:我已经从jsr303和hibernate中尝试了@NotNull和@NotEmpty,但都失败了。我仍然可以发送一个像“.”这样的空白字符串。

也许

定义为:

@NotNull
@Size(min=1)
既然你用的是richfaces,我猜你用的是?它处理JSR303注释

更新:尝试(取自):


如果您使用Hibernate Validator 4.1作为JSR-303实现,那么它们提供了一个与@NotNull和@NotEmpty完全不同的注释,可以完全满足您的需要。您需要使用(当前)最新版本,但这将起作用


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

Hibernate Validator 4.1+提供了一个自定义的纯字符串注释,在修剪空白后检查NOTNULL和not empty。
@NotBlank
的api文档说明:

NotEmpty的不同之处在于尾部的空白被忽略了

如果不清楚
@NotEmpty
是否在检查前修剪字符串,请首先查看表下4.1文档中给出的说明:

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

然后,浏览代码,您将看到
@NotBlank
是:

在这个定义中有两件事需要注意。第一个是
@NotBlank
的定义包括
@NotNull
,因此它是
@NotNull
的扩展。第二个是通过使用NotBlankValidator.class的
@约束来扩展
@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。

@NotEmpty允许字符串中包含空格,即“被认为是有效的。谢谢,这帮助我编写了一个自定义验证器。
@Documented
@Constraint(validatedBy=NotBlankValidator.class)
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@NotNull
public @interface NotBlank{
  /* ommited */
}
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
  if ( charSequence == null ) { //this is curious
    return true;
  }
    return charSequence.toString().trim().length() > 0; //dat trim
}