Glassfish 3.1.2.2、Java ee6 を使用しています。
クラスが CDI を使用してヘルパー クラスを取得するライブラリがあります。そのライブラリを使用するある特定のプロジェクトで、その CDI 依存関係をオーバーライドし、代わりにそのプロジェクトに固有の独自のヘルパー クラスをライブラリに強制的に使用させたいと考えています。ライブラリは自由に変更できますが、デフォルトでは、ライブラリの他のユーザーの動作が変わらないように、デフォルトのヘルパー クラスを使用する必要があります。
@Alternative
これは、 CDI パターンの完璧なアプリケーションです。ヘルパー クラス API の Java インターフェイスを作成しました。ライブラリにはデフォルトの実装があり、 ;で<alternatives>
タグを使用できます。beans.xml
動作をオーバーライドしたいプロジェクトでは、その特定のプロジェクトの beans.xml でヘルパーの独自の実装を指定します。
それが機能しないことを除いて。CDI 1.0 (java ee6) のライブラリの外部にあるライブラリからの代替動作をオーバーライドすることは明らかに 不可能です。
そのため、外部プロジェクトの beans.xml で何を指定しても、CDI はライブラリで定義された Bean を選択し続けます。
プロデューサーを経由することを検討しましたが、CDI からプロデューサーに EntityManager をパラメーターとして渡して、それをヘルパー クラスに渡す方法がわかりませんでした。このプロジェクトでは、通常、@PersistenceContext
アノテーションを使用して EntityManager を注入します。
外部プロジェクトからの CDI インジェクションをオーバーライドする方法についてのアイデアはありますか?