5

以下のような 2 つの属性を持つカスタム フィールド アノテーション クラスが 1 つあります。

public @interface Field {
    String type();
    int order();
}

を検証したかったorderのですが、負の値であってはならず、繰り返してはなりません。次に例を示します。

class User {
    @Field(uiType = "TEXT", order = 1)
    private String fName;

    @Field(uiType = "TEXT", order = 2)
    private String lName;
}

誰でも私がそれをするのを手伝ってもらえますか?

4

4 に答える 4

4

これは Bean Validation API の目的ではありませんが、これを使用してこの検証を実行できます。BV API の参照実装であるHibernate Validatorを使用すると仮定しています。

単純なバリデーターを使用して、ネガティブ チェックを取り除くことができます。@Field を次のように変更します

@Constraint(validatedBy = MyFieldValidator.class)
public @interface Field {
    String type();
    int order();
}

MyFieldValidatorそして、次のようにクラスを作成します

public class MyFieldValidator implements ConstraintValidator<Field, Object> {

    private int order;

    @Override
    public void initialize(Field annotation) {

        this.order = annotation.order();

        if (this.order < 0) {
          // blow up
        }
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {

        return true;
    }
}

次に、たとえば を使用してオブジェクトをバリデーターに通すと、Validation.buildDefaultValidatorFactory().getValidator().validate(someUser)負の順序アノテーション属性はすべて失敗します。

繰り返しを防ぐことはよりトリッキーです。最も健全なオプションは、Userクラス レベルで検証アノテーションを配置し、リフレクションを使用してアノテーションを 1 つずつ取得することです。クラスレベルのアノテーションを使用する利点は、チェックするクラスを Hibernate Validator に伝える簡単な方法を提供することです。それほど重要でない部分は、クラスに注釈を付けるのを忘れる可能性があることです。

于 2013-07-01T20:31:46.850 に答える
-1

リフレクションを介して値をチェックするバリデーターを作成できます。アプリケーションで最初にこのバリデーターを実行します。

于 2013-07-01T15:43:54.930 に答える
-1

ConstraintValidatorあなたを助けるはずです。

于 2013-07-01T15:51:12.700 に答える