2010-07-16 103 views
0

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

@编辑:我已经尝试了@NotNull和@NotEmpty从jsr303和休眠,但他们都失败我仍然可以发送一个空白字符串,如“”。

回答

9

如果你使用了Hibernate Validator 4.1的JSR-303实现,他们提供了一个@NotBlank注解,它正是你要找的内容,与@NotNull和@NotEmpty分开。你需要使用(当前)最新版本,但这将起作用。

如果出于某种原因无法进入最新版本,那么自己写一个注释并不需要太多。

+1

一个,所以他们添加它;)+1 – Bozho 2010-07-16 14:12:25

+0

谢谢,奇怪我无法在谷歌找到它。 – 2010-07-16 14:14:29

0

也许@NotEmpty

其定义为:

@NotNull 
@Size(min=1) 

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

更新:尝试(从here拍摄):

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

试过了,它不起作用。 – 2010-07-16 14:00:59

+0

你是怎么试试的,实际上 – Bozho 2010-07-16 14:05:23

+0

@NotEmpty允许带有空白的字符串,即“”被认为是有效的。 – GaryF 2010-07-16 14:10:00

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的@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 
} 

有趣的是,这个方法返回true,如果该字符串是空的,但假的当且仅当修剪字符串的长度为0。这是确定的,如果它返回true它是空的,因为,正如我所提到的,@NotEmpty定义也需要@NotNull。

+0

谢谢,这帮助我编写了一个自定义验证器。 – Lambart 2015-07-01 05:32:01