5

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 で私の要件を実装する良い方法はありますか?

4

3 に答える 3

6

はい Bean Validation はこの機能をサポートしています。これは、検証グループおよびグループ シーケンスと呼ばれます。グループは単純なマーカー インターフェイスです。たとえば、FirstSecondの 2 つのインターフェイスを作成し、コードを次のように変更できます。

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

次に、グループ シーケンスを定義できます。

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

Validatorを取得し、validator.validate(myObject, All.class) を呼び出します

それはすべてドキュメントにあります。

于 2010-09-30T14:06:01.730 に答える
2

2つのシーケンスを定義することを検討しましたか。1つは名前用、もう1つはメール用ですか?

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

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

この場合、次のようにバリデーターを呼び出します。

validator.validate(myObject, AllName.class, AllMail.class)
于 2010-10-04T07:29:17.550 に答える