JSR303 Bean Validation を使用して、フォーム入力をチェックします。
@NotBlank
@Size(min = 4, max = 30)
private String name;
@NotBlank
@Size(max = 100)
@Email
private String mail;
name = '' and email = '' の場合、@NotBlank、@Size at name、@NotBlank、@Size、@Email at mail がチェックされます。
チェックオーダーを設定したいのですが、前のオーダーが無効な場合、次のオーダーはチェックされません。
@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 は無効であるため、2 番目と 3 番目のグループはチェックされません。
しかし、私が必要としているのは名前の @NotBlank であり、メールの @NotBlank、@Size、@Email をチェックする必要があります。name の @NotBlank が無効であるため、name の @Size はチェックされず、mail の @NotBlank,@Size が有効であるため、mail の @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 で私の要件を実装する良い方法はありますか?