プロデューサを使用するまでは正常に動作していたスタンドアロン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があります。
何が起こっているかの手掛かりはありますか?
私には恥じらいます。私が気づいていなかった基本的なものです。ありがとうございました。私は内部の依存関係が@InjectでマークされたBeanのプロデューサを作る必要はありませんでした。それは常に成功しました。私の頭では、コンストラクタに引数を渡すと、CDIは明示的にInjectでマークされた属性を注入し続けます。これは実装が難しいので、フレームワークの動作が正しいと思います。 –
私は別のクラス(余分な依存関係なし)でこのマップ(私の記事を参照)をラップすることによって問題を解決することができます。だから、私はこのクラスのプロデューサーを作りました(これはうまくいきます)。そしてコンストラクター経由でLaminaValidadorでそれを宣言します。今は魅力のように働く。再度、感謝します。 –
うれしい私は助けることができました!別のクラスでBTWのラッピングが確実に機能しますが、プロデューサメソッドを作成することもできます。プロデューサメソッドはマップを生成します(メソッドの本体では、必要に応じて初期化します)。そのようなプロデューサメソッドは、あなたが現在持っているのと同じクラスに存在する可能性があります。次に、あなたの 'LaminaValidador'クラスのコンストラクタ(例えば、[コンストラクタインジェクションを使う](http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#declaring_bean_constructor))を含むどこにでも地図を挿入できます。 。 – Siliarus