プロパティを読み取るためにプロデューサメソッドからBeanを取得したいとします。いくつかのシナリオでは、BeanはEJB Singleton
beanです。injectionPoint.getBean()は、Java EE 7(CDI 1.1)のEJB Beanである場合はnullを返します。
問題に集中するようにコードを単純化しました。
私の簡単な修飾子:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InjectMe {}
シンプルプロデューサー:
@Dependent
public class SimpleProducer {
@Produces
@InjectMe
public String getInjectMe(InjectionPoint ip) {
// ip.getBean() returns null for some reason
return "ip=" + ip + ", bean=" + ip.getBean();
}
}
EJB(シングルトン):
@Singleton
@Startup
public class SimpleSingleton {
@Inject
@InjectMe
private String injectMe;
@PostConstruct
public void init() {
System.out.println(injectMe);
}
}
コンソール出力:
情報:IP = [BackedAnnotatedField] @Inject @InjectMeプライベートcom.test.ejb.SimpleSingleton.injectMe、
bean=null
私はCDI
BeanにSingleton
Beanを変更すると、すべてがip.getBean()
戻っnullではない(正常に動作します)。 Singleton
でもJava EE 6
で働いていましたが、Java EE 7
にはありません。私はGlassfish 4アプリケーションサーバーを使用しています。
この動作はどこかで指定されていますか? WildFly 10.1.0での私のために
injectionPoint.getMember().getDeclaringClass()
作品を使用して
グラスフィッシュのような音です。 –
@JohnAment:そうではないと思いますが、WildFlyと同じ動作です。 質問にまだ答えることはできませんが、考えられる理由は次のとおりです。1)Beanディスカバリモジュールの動作の変更(デフォルト: 'annotated'); 2)(非コンテキストの)クラスStringを注入する。 3) 'Dependent'以外のスコープが宣言されていない –
' ip.getMember()。getDeclaringClass() 'を呼び出すと、FQCNのどちらの場合も、InjectionPoint APIのdocの例としても使用されます。私はDeltaspikeの例で、 'bean'が' null'の後にフォローアップコールとしてそれを見ました。 –