2016-11-13 5 views
1

私はCDI拡張を書いています。CDI拡張では、注入点が満足されるかどうかを判断する最も簡単な方法は何ですか?

Beanのデプロイ時に特定の注入ポイントが満たされているかどうかを確認し、満たされない場合は削除するのが最も簡単な方法は何ですか?あなたはBeanが、それを満たすために存在しているかどうか、任意のInjectionPointで、言うことができないので、豆の発見は、まだ完了していないので、

ProcessInjectionPoint -timeは、時期尚早です。

ProcessInjectionTarget時には、すべての注入点はすでに読み込まれていますが、現在は削除する方法がないため、間違った場所と思われます。

注入ポイントが満たされないと判断できる場合は、注入ターゲットから注入ポイントを削除できるイベントが必要です。

(背景:私はプログラム的optional属性を備えGuiceののcom.google.inject.Inject注釈を()翻訳するとぐちゃぐちゃしています)

答えて

0

は、私はそれを行うことが可能であるとは思わない、少なくともないこの方法。あなたの問題は、CDI-45 issueで議論されたものと非常によく似ています。このユースケースを説明する価値はあります。

あなたのケースでは、古典的な注入の代わりに@Inject Instance<MyBeanClass>を使用しています。これにより、実行時にIPを満たすBeanがあるかどうかを検出することができます。 com.google.inject.Injectとそのoptional機能についてはわかりませんが、CDI Instanceはそれに近いと思われます。

EDIT:私の同僚は、あなたを助けるかもしれない1つの華麗なアイデアを持ってきました。あなたは引き続きエクステンションを使用し、AfterBeanDiscoveryフェーズを観察します。今すぐあなたがBeanManagerを使用して手動で解決されているかどうか確認したいです。その目的のためにはBM.resolve(BM.getBean())に行くでしょう。あなたのオプションのIPのいくつかが満足されていないことが分かったら、AfterBeanDiscovery.addBean(myWrapperBean)に電話したいと思うでしょう。ここで、インターフェイスのimpl(ラッパー)はmyWrapperBeanです。このラッパーは基本的にnullを返す「ダミープロデューサー」になります。

カスタムビーンズでは機能しませんが、それはそうする必要があります。豆はAfterBeanDiscoveryで追加されましたが、それはあなたにとっては大丈夫だと思います。

+0

本当にありますが、残念ながら私が扱っているコード(私が制御しないコード)では、代わりに 'com.google.inject.Inject(optional = true)'を使用していました。うーん。基本的には、コンテナの検証時に注入ポイントを効果的に傍受しようとしていますが、不良であると判断された場合は、関連するフィールド/パラメータを代わりに 'null 'に設定してください。私はそれが私が持っていない文脈を必要とするとは思わない - 確かにCDIのtypesafe解決アルゴリズムは、ここに必要なすべてのコンテキストを持っていますか?私が欠けているのは、ライフサイクルの正しい点にあるミューテータです。おそらく、代わりに生成されたプロデューサメソッドを導入する必要があります。 –

+0

ああ、私はあなたを誤解しています。その場合、私の答えの最初の部分はあまり意味がありません、無視してください。はい、タイプ解決のメカニズムは、アプリケーションの初期化時に条件を検証し、実際には十分な情報を持っています。それでも私はここであなたを助けることができる「ミューテータ」の仕組みがないことを知っています。あなたの問題は、[CDI-45の問題](https://issues.jboss.org/browse/CDI-45)で議論されたのと全く同じように聞こえる - このユースケースを説明するコメントを追加する価値がある。または、Weld forum/issue trackerで私たちに打つことで、これについてさらに議論することができます。私はここで答えを更新します。 – Siliarus

関連する問題