JSF / Hibernate NotBlankvalidation
我有一个简单的JSF + RichFaces表单,有一些字段,显然是一个支持bean来存储它们。 在那个bean中,所有必需的属性都有validation注释(jsr303 / hibernate),但我似乎无法找到一个注释来检查属性(String)是否为空。 我知道spring模块中有@NotBlank注释,但JSF不支持springvalidation。 有没有简单的方法来检查它,还是我应该编写自己的注释?
@Edit:我已经尝试过来自jsr303和hibernate的@NotNull和@NotEmpty,但是他们都失败了我仍然可以发送一个像“”这样的空白字符串。
如果你使用Hibernate Validator 4.1作为你的JSR-303实现,它们会提供一个@NotBlank注释,它完全可以完成你正在寻找的东西,与@NotNull和@NotEmpty分开。 您需要使用(当前)最新版本,但这将有效。
如果由于某种原因无法使用最新版本,那么自己编写注释并不需要太多。
Hibernate Validator 4.1+提供了一个自定义的仅字符串@NotBlank
注释,它在修剪空格后检查非空而不是空。 @NotBlank
的api文档声明:
与NotEmpty的区别在于尾随空格被忽略。
如果不清楚@NotEmpty
是否在检查之前修剪字符串,请首先在“内置constaints”表下看到4.1文档中给出的描述:
检查带注释的字符串是否为空且修剪长度是否大于0.与@NotEmpty的区别在于此约束只能应用于字符串并且会忽略尾随空格。
然后,浏览代码,您将看到@NotBlank
被定义为 :
@Documented @Constraint(validatedBy=NotBlankValidator.class) @Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) @Retention(value=RUNTIME) @NotNull public @interface NotBlank{ /* ommited */ }
这个定义有两点需要注意。 第一个是@NotBlank
的定义包括@NotNull
,所以它是@NotNull
的扩展。 第二个是它通过使用带有@Constraint
的@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 。
也许@NotEmpty
?
其定义为:
@NotNull @Size(min=1)
既然你使用的是richfaces,我想你正在使用
? 它处理JSR 303注释。
更新 :尝试(取自此处 ):
@Pattern(regex="(?!^[\s]*$)").
- Hibernate – 激活Bean Validation集成时出错
- JPA – 找不到类型为enum的validation器
- 是否有使用带注释的方法参数启用JSR 303 Bean Validation的标准方法
- 条件Beanvalidation
- javax.validation.ValidationException:无法找到默认提供程序
- BigDecimal的JPA @Size注释
- 在@Constraint中清空validatedBy
- Hibernate Validator方法或构造函数validation
- Bean Validation Groupinheritance不适用于Group Sequence Provider