我使用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?
非常感謝您的回覆,小組順序不符合我的需要,我編輯我的問題。 – eckelcn 2010-10-01 09:58:24