0

Java Bean 検証で使用するカスタム アノテーションを指定しました。すべてのフィールドに同じ注釈クラスを使用し、次のように、フィールドの名前を含む文字列パラメーターを渡します。

@CustomConstraint(value="name")
private String name;
@CustomConstraint(value="address1")
private String addressLine1;

私の制約バリデーターは、検証クラスのインターフェースに文字列キー (フィールドの名前) をマップする HashMap を維持します。次のように、特定のフィールド名と、フィールドの検証に使用されるインターフェイスの具体的なサブクラスを組み合わせて、このマップを静的に初期化します。

private static final Map<String, CustomValidatorClass> fieldMapper; 

static {
    Map<String, CustomValidatorClass> map = new HashMap<String, CustomValidatorClass>();
    map.put("name", new NameValidator());
    map.put("address1", new Address1Validator());
    fieldMapper = Collections.unmodifiableMap(map);
}

私の懸念は、この初期化プロセスが非常に高価になる可能性があり (私は数十のフィールドを持っています)、検証しているすべての単一フィールドに対して初期化される可能性があることです。注釈を一度初期化して再利用するか、これがデフォルトの動作であることを指定する方法があることを願っています。

編集:私はBean検証とともにJSF 2.0を使用しているため、これらの注釈を直接読み取ったり呼び出したりしていません。これはフレームワークによって処理されるため、フレームワークがどのように動作しているかを正確に判断できませんでした。

4

2 に答える 2

0

いくつかのテストを行いましたが、マップで行っている静的初期化は、フィールドを初めて検証しようとしたときにのみ呼び出されるようです。これは、アノテーションが繰り返し初期化されるのではなく、各フィールドで再利用されることを意味します。大規模な初期化でのオーバーヘッドについての懸念が解消されました。

于 2012-09-05T14:29:59.703 に答える
0

あなたの質問はあまり明確ではなく、あなたのデザインは私には奇妙に思えます:

  1. 注釈でフィールドの名前をコピーするのはなぜですか? 実行時に注釈を調べると、どの注釈がどのフィールドにバインドされているかがわかります。あなたvalueは冗長なようです。

    @CustomConstraint(value="フィールド名"))

    フィールドのタイプ フィールドの名前。

  2. 静的マップでフィールドをバリデーターにマップするのはなぜですか? 注釈を使用してこのマッピングを定義できます。

    @CustomConstraint(validator=NameValidator.class)

    フィールドのタイプ フィールドの名前。

これが、ほとんどの注釈ベースの検証フレームワークの動作方法であると思います。たとえば、春の注釈ベースの検証などです。

編集

注釈を読むには、次のようなことをしている必要があると思います。

for(Field field : cls.getDeclaredFields()){
 Class type = field.getType();
 String name = field.getName();
 Annotation[] annotations = field.getDeclaredAnnotations();
}

したがって、特定の注釈が特定のフィールドにどのように属しているかがわかります。

于 2012-09-05T07:55:00.237 に答える