2010-07-16 102 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