2016-11-17 12 views
0

独自のプロキシビーンを作成する既存のCDI拡張を修正しようとしています。現在、各サービスに対して作成されるプロキシは1つだけです。サービスにはアプリケーションスコープのようなものがあるため、サービスのインスタンスは常に1つだけです。CDI拡張であいまいな依存関係を解決する

私が達成したいのは、すべての注入ポイントに対して1つのプロキシBeanを作成することです。与えられた注入点に特有の情報を保存するためにそれらが必要です。同じサービスに複数の注入ポイントがある場合は、より多くのプロキシビーンが存在しますが、それらの背後にはサービスの単一のインスタンスが存在します。しかし、このように振る舞いを変えると、Weldはまったく同じプロキシを2つ選ぶことができないため、あいまいな依存関係について不平を言っています。

どうすればこの問題を解決できますか?基本的には、ProcessBeanイベントを観察し、発見されたすべてのBeanの各注入ポイントに対して新しいプロキシを作成しています。次に、私はAfterBeanDiscovery#addBeanメソッドを使用して、これらのプロキシビーンをすべてコンテナに追加します。私は何とかこの最後のステップをスキップして手動で注入ポイントに注入するか、注入する正しいBeanを選択する決定に影響を与える必要があります。注入ポイントと注入可能なあいまいな依存関係のリストを与えられたら、その属性に基づいて正しいものを選ぶことができます。しかし、Weldのためにこの決定をすることが可能かどうか、どうすればいいのかは分かりません。

EDIT:単に私がやりたいことは@Dependentのが、私は与えられた注入ポイントに関連するいくつかの追加情報を格納可能なプロキシと同様の自分のスコープを実装することです。

EDIT2:私は最終的に、特定の注入点に関する情報を運ぶ新しい修飾子を作成することでそれを修正しました。この修飾子は、注入ポイントとそのプロキシの両方に追加されます。しかし、私は注入点を修飾子コレクションの変更を可能にする独自の実装に置き換えなければならないので、それほど素晴らしい解決策ではありません。もっと洗練されたソリューションが必要だと思います。あなたが何かを考えることができるなら、私に知らせてください。

答えて

0

まず最初に、修飾子付きのソリューションには、実際には正しいアプローチですが、与えられた状況では少し余計な作業があります。

あなたのケースが正しく行われたら、1つの内線番号に2人のオブザーバーを使用できます。

最初に、ProcessBeanAttributesフェーズとveto()あなたがしたくない元の豆を観察します。

void observePBA(@Observes ProcessBeanAttributes<?> bean) { 
    // I used '?' as a type, so here you do your check for 
    // the actual bean class to know which one is it and whether 
    // you actually want to veto such bean 
    bean.veto(); 
} 

他の観察者は、あなたが既に持っているものです - AfterBeanDiscovery#addBeanで独自のBeanを追加します。

void observeABD(@Observes AfterBeanDiscovery abd) { 
    // add your custom bean, assuming you have it prepared somewhere 
    abd.addBean(myCustomBean); 
} 

このように、コンテナの起動時に、元のBeanを削除して独自のBeanを追加します。そうすれば、Weldにはあいまいな解決問題はありません。

+0

私が正しく理解しているのであれば、元の豆を拒否することです。しかし、これは私の場合は問題ではありません。なぜなら、注入ポイントには合わず、メソッドが呼び出されたときにプロキシによって手動で検索されるからです。問題は、同じタイプと修飾子を持つ2つの注入点があり、まったく同じ2つのプロキシが(それらの内部の異なる設定でのみ)作成されている場合です。 – livthomas

+0

それでは、私はあなたのテキストを誤解しているかもしれません。コードスニペットが役に立ちます。注射の候補は、1)元の豆、2)あなたの新しく作成された代理人だと思った。 – Siliarus

+0

実際、プロジェクトはオープンソースなので、すべて見ることができます。私はここで[このコミット](https://github.com/SilverThings/SilverWare/commit/abb44eae805f78f8b88959bd740f9d31cfe042d8)で説明した変更を行いました。 – livthomas

関連する問題