0

独自のプロキシ Bean を作成する既存の CDI 拡張機能を変更しようとしています。これで、サービスごとに 1 つのプロキシのみが作成されます。サービスにはアプリケーション スコープのようなものがあるため、サービスのインスタンスは常に 1 つだけです。

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

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

編集:単に私がやりたいことは、@Dependent特定の注入ポイントに関連する追加情報を保存できるプロキシを使用して、同様の独自のスコープを実装することです。

EDIT2:特定の注入ポイントに関する情報を運ぶ新しい修飾子を作成することで、最終的に修正しました。この修飾子は、注入ポイントとそのプロキシの両方に追加されます。しかし、修飾子コレクションの変更を可能にする独自の実装で注入ポイントを置き換える必要があるため、これはあまり良い解決策ではありません。もっとエレガントな解決策が必要だと思います。思いつくことがあれば教えてください。

4

1 に答える 1

0

まず、修飾子を使用したソリューションに-それは確かに正しいアプローチですが、特定の状況では少し冗長な作業だと思います。

あなたの主張が正しければ、1 つの拡張機能で 2 つのオブザーバーを使用できます。

最初に、必要のないProcessBeanAttributesフェーズと元の Bean を観察します。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();
}

もう 1 つのオブザーバーは、既に持っているもので、独自の Bean を に追加しますAfterBeanDiscovery#addBean

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

このようにして、コンテナーが起動するときに、元の Bean を削除してカスタム Bean を追加します。そうすれば、Weld にあいまいな解像度の問題が発生することはありません。

于 2016-11-21T14:17:16.790 に答える