2016-10-24 4 views
0

プロデューサを使用するまでは正常に動作していたスタンドアロンJavaプロジェクトでWELD SEを使用しています。プロデューサメソッドを使用しているときにCDI(Weld SE)に内部依存関係が注入されない

プロデューサメソッドは動作します。コンテナはそれを使用しますが、生成されたBeanの内部の依存関係は決して注入しません。プロデューサーを削除すると、正常に動作します。スペックやGoogleで長い間検索しても、原因を見つけることはできません。プロデューサーの

例:

@ApplicationScoped 
public class LaminaValidadorProducer { 

    private static final String XSD_PATH = getConfig("processador.xsd.path"); 
    private static final Map<VersaoLamina,String> XSD_PER_VERSION = new HashMap<>(); 
    static { 
     XSD_PER_VERSION.put(VersaoLamina.V1, getConfig("processador.lamina.xsd.file")); 
     XSD_PER_VERSION.put(VersaoLamina.V2, getConfig("processador.laminav2.xsd.file"));   
    } 

    @Produces 
    public LaminaValidador buildValidador() { 
     return new LaminaValidador(XSD_PATH, XSD_PER_VERSION); 
    } 
} 

LaminaValidadorが正常に注入されるが、(@Inject印)、その内の属性が注入されていません。プロジェクトにbean-discovery-mode = "all"のbeans.xmlがあります。

何が起こっているかの手掛かりはありますか?

答えて

1

これはSEの問題であるだけでなく、実際にはCDIの望ましい/期待される挙動である()。

これは、通常、プロデューサがない場合、CDIは(no-argsコンストラクタをコールするか、またはインジェクションを使用して)Beanクラスを作成し、続いてBean内の注入ポイントを解決します他にもいくつかのことをしています、スペック参照)。 など。ライフサイクル管理をCDIコンテナに任せます。一方

、プロデューサーを使用すると、通常のクラスのうち、Beanを作成する方法です:あなたは、例えば、ライフサイクルにyouselfを制御することはできません

  • EntityManagerの
  • あなたは他のフレームワークとintergrateと、彼らは
  • 複雑な初期設定を持っているあなたは
  • 特定のコンストラクタを呼び出す前に外部設定のためのいくつかのチェックを行う必要があるか、あなたは多分プリミティブ型(int型)
  • のための豆をしたいと多くの多くのユースケース

これは、の作成を担当するを意味します。それには、フィールド内の任意のフィールドが含まれます。 Containerは、プロデューサを本格的なBeanを作成する方法とみなし、世話をしたり、初期化に必要なものを想定しています。

今、あなたの質問から私は内部に注入点の解像度が必要と判断します。 CDIの静的な性質(および他のより複雑な理由)のために手動で解決を「施行する」ことが容易な方法はありません。したがって、私は別のアプローチを使用し、コンストラクタインジェクションや初期化メソッドを利用することを提案しますか?より多くの情報を提供すれば、私は助けることができるかもしれません。

+0

私には恥じらいます。私が気づいていなかった基本的なものです。ありがとうございました。私は内部の依存関係が@InjectでマークされたBeanのプロデューサを作る必要はありませんでした。それは常に成功しました。私の頭では、コンストラクタに引数を渡すと、CDIは明示的にInjectでマークされた属性を注入し続けます。これは実装が難しいので、フレームワークの動作が正しいと思います。 –

+0

私は別のクラス(余分な依存関係なし)でこのマップ(私の記事を参照)をラップすることによって問題を解決することができます。だから、私はこのクラスのプロデューサーを作りました(これはうまくいきます)。そしてコンストラクター経由でLaminaValidadorでそれを宣言します。今は魅力のように働く。再度、感謝します。 –

+0

うれしい私は助けることができました!別のクラスでBTWのラッピングが確実に機能しますが、プロデューサメソッドを作成することもできます。プロデューサメソッドはマップを生成します(メソッドの本体では、必要に応じて初期化します)。そのようなプロデューサメソッドは、あなたが現在持っているのと同じクラスに存在する可能性があります。次に、あなたの 'LaminaValidador'クラスのコンストラクタ(例えば、[コンストラクタインジェクションを使う](http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#declaring_bean_constructor))を含むどこにでも地図を挿入できます。 。 – Siliarus

関連する問題