2011-11-15 21 views
3

異なる実行環境(テスト、ステージング、プロダクションサーバと考える)に対して、@Alternatives、@Decorators、@Injectorsを設定する必要があります。実行時のJSR-299(CDI)設定

今私は3つの戦争を作成するために、Mavenを使用し、それらの戦争の唯一の違いは、beans.xmlのファイルです。これを行うより良い方法はありますか?私はさまざまな環境の@Alternative @Stereotypesを持っていますが、bean.xmlを変更する必要があります。@Decoratorsのためには動作しません(またはそれらは?)

CDIにbeans.xmlの値を無視し、カスタム構成ソースを使用しますか?そのため、たとえば、システムプロパティやその他の環境変数を読み取ることができます。

アプリケーションは、排他的に溶接を使用した容器内で実行するので、溶接固有のソリューションは大丈夫でしょう。

私はすでにこれをグーグルしようとしましたが、良い検索用語を見つけることができないよう、と私はWeld-Users-Forumsを尋ねたが、無駄に。そこの誰かが自分のカスタム拡張を書くことを提案しましたが、実行時に実際にコンテナの設定を変更するAPIは見つかりません。

@ApplicationScoped構成Beanをある種のものにして、それをすべての@Decoratorsに注入して、それをアクティブにするかどうかを決めることができると思います。@Alternativesは@Producesメソッドを作成します複数のインプリメンテーションを持つすべてのインタフェースに対して、コンフィグBeanをインジェクトする必要があります。 これは、すでにCDIに存在する機能を本質的に複製するための不必要な作業がたくさんあるようです。 [OK]を

編集

、私はもちろん、CDI拡張APIを使用して、実行時にステレオタイプとインターセプタを追加することが可能です...私は少し愚かだ実現:

void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) { 
    bbd.addInterceptorBinding(...) 
    bbd.addStereotype(...) 
} 

しかし、私が見つけられなかったのはデコレータを追加するAPIでした。私が見つけた唯一のことは、私は@Decoratorをアクティブにしたくない場合は、その後

public <T> void processAnotated(@Observes ProcessAnnotatedType<T> event) 

を観察し、

event.veto() 

を呼び出し、beans.xmlの中のすべての@Decoratorsを有効にしました。

+0

それは我々が代替案を切り替える拡張機能を記述する必要があることは非常にイライラさせられる... –

答えて

1

JBoss Seam、特にはんだサブプロジェクトをご覧ください。

それは、依存駆動CDIの解決を可能にする、特定の豆は他のBeanまたはリソースが利用可能な場合にのみ利用可能であることをそう。 (「dataSource」が利用可能な場合はクラスA、「entityManager」が利用可能な場合はクラスB)

オープンソースであるため、必要に応じて自分自身の拡張子。

JSFを使用している場合は、2つのインジェクションフレームワーク(JSF DI/CDI)を使用していることを排除し、JSFスコープでCDIビーンを許可するので、SEAM-JSFの使用も強くお勧めします。

+0

おかげで、あなたのヒントは、正しい方向に私を送りました! – nsn

+0

それを聞いてうれしいです。beans.xmlよりもうまく動作することを願っています。 – SplinterReality

関連する問題