2010-09-30 62 views
4

我使用JSR303 Bean驗證來檢查表單輸入。如何設置JSR303 bean驗證的檢查訂單

@NotBlank 
@Size(min = 4, max = 30) 
private String name; 

@NotBlank 
@Size(max = 100) 
@Email 
private String mail; 

時則是name = '' 和email = '',在@NotBlank,@Size的名字,@NotBlank, @Size,@Email的郵件將被檢查。

我想設置檢查順序,例如,當前一個訂單無效時,下一個不被檢查。

@NotBlank(order = 1) 
@Size(min = 4, max = 30, order = 2) 
private String name; 

(以上不被JSR303支持)

有沒有實現它使用JSR303的方法嗎? (我認爲自定義註釋會完成,但我不想爲每個屬性添加自定義註釋)

而且我也考慮驗證組和序列組,但我認爲對於我的需要有一些區別。

@NotBlank(groups = First.class) 
@Size(min = 4, max = 30, groups = Second.class) 
private String name; 

@NotBlank(groups = First.class) 
@Size(max = 100, groups = Second.class) 
@Email(groups = Third.class) 
private String mail; 

當名稱爲空且郵件爲「abc」時。只有名稱處的@NotBlank和郵件中的@NotBlank將由JSR303進行檢查,因爲名稱中的@NotBlank無效,所以不檢查第二和第三組。

但我的需要是@NotBlank在名稱和@NotBlank,@Size,@Email在郵件應該被檢查。由於名稱中的@NotBlank無效,因此不會檢查名稱中的@Size,並且郵件中的@ NotBlank,@ Size有效,因此將檢查郵件中的@Email。

也許,下面的僞代碼會清楚地描述我的要求。

// retrieves all fields and check one by one. 
for (Field field : fields) { 
    List annotations = getJsr303Annotations(field); 
    // retrieves all annotations on field and check one by one. 
    for (Annotation annotation : annotations) { 
    CheckResult result = check(annotation, field); 
    if (result.isValid()) { 
     continue; 
    } else { 
     errors.add(result); 
     break; 
    } 
    } 
} 

有沒有一種很好的方法來實現我的需求通過JSR303?

回答

6

是Bean驗證支持此功能。它被稱爲驗證組和組序列。組是簡單的標記接口,例如,你可以創建兩個接口首先和更改您的代碼是這樣的:

@NotBlank(groups = First.class) 
@Size(min = 4, max = 30, groups = Second.class) 
private String name; 

然後,你可以定義一組序列:

@GroupSequence({ First.class, Second.class}) 
interface All { 
} 

獲取驗證的保持和呼叫validator.validate(myObject的,All.class)

這一切都在文檔。

+1

非常感謝您的回覆,小組順序不符合我的需要,我編輯我的問題。 – eckelcn 2010-10-01 09:58:24

1

你有沒有考慮過定義兩個序列。一個用於名稱和一個用於郵件

@GroupSequence({NameFirst.class, NameSecond.class}) 
interface AllName { 
} 

@GroupSequence({MailFirst.class, MailSecond.class, MailThird.class}) 
interface AllMail { 
} 

在這種情況下,你會這樣調用驗證:

validator.validate(myObject, AllName.class, AllMail.class) 
2

驗證的有關注釋的順序/不能指定的約束在寫這個答案的時候。我前一段時間向Hibernate Validator團隊提交了與訂單有關的問題,該問題已被接受,並可能在下一個Bean驗證規範版本中解決 - 請參閱此處的更多詳細信息:http://beanvalidation.org/proposals/BVAL-248/順便說一句,在簡單情況下,您可以避免「訂單衝突「通過使用」非衝突「的註釋組合,例如NotNullSize - 對於null值,尺寸將評估爲true。