5

ここでの問題の一部は、適切な語彙を使用することです。そのため、用語の単純な問題である可能性があることを前もってお詫びします。

Personインターフェイスと、そのインターフェイスを実装するクラスPersonBeanがあるとします。

さらに@Produces、 を返す (注釈付きの)プロデューサー メソッドがどこかにあるとしますPerson。内部的には newPersonBeanを返しますが、それはここにもありません。

最後に、次のように定義された注入ポイントを持つ別の CDI Bean があるとします。

@Inject
private Person person;

すべてのbeans.xmlファイルが配置され、Weld または別の CDI-1.0 準拠の環境がブートストラップされていると仮定すると、あいまいな定義エラーが発生します。これは理にかなっています: Weld は myPersonBeanをインジェクションの候補として見つけ (コンストラクターを呼び出すだけでよい)、私のプロデューサー メソッドの出力をインジェクションの候補として見つけます。

私がやりたいことはPerson、このアプリケーションでのインスタンスの生成が常にプロデューサー メソッドを経由するように強制することです。

どこかで何らかの修飾子を発明Personし、その修飾子によって修飾されるインスタンスをプロデューサー メソッドに生成させることができることを理解しています。私がそれを行い、修飾子を含むように注入ポイントを変更すると、明らかにこれらの修飾された注入可能オブジェクト (つまり、私のプロデューサー メソッド) のソースは 1 つしかないため、出来上がり、問題は解決しました。

しかし、偽の修飾子を発明したくないとします。(これが事実だと言っているわけではありません。問題をより深く理解しようとしているだけです。) どのような選択肢がありますか? 私は持っていますか?CDIに見えないようにするために を@Typed(Object.class)つければいいのかな…。PersonBeanPerson

ドキュメントへのポインタ、またはこれを理解するためのより良い方法など、あらゆるアイデアを歓迎します。ありがとう。

4

3 に答える 3

3

PersonBean に @Alternative としてアノテーションを付けると、プロデューサー メソッドが使用されます。

于 2012-06-07T13:15:21.497 に答える
2

ここや他の場所でいくつかの異なる回答を消化することから、私が採用した解決策は、Bean@Typedで の値を持つ注釈を使用することです。Object.classこれは、次のように宣言されたフィールドにのみ注入できることを意味します。

@Inject
private Object something;

...ありがたいことに、ほとんど存在しないことが証明されています。:-)

于 2012-06-08T16:15:01.190 に答える