2016-01-06 4 views
5

プロパティを読み取るためにプロデューサメソッドから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() 

作品を使用して

+0

グラスフィッシュのような音です。 –

+0

@JohnAment:そうではないと思いますが、WildFlyと同じ動作です。 質問にまだ答えることはできませんが、考えられる理由は次のとおりです。1)Beanディスカバリモジュールの動作の変更(デフォルト: 'annotated'); 2)(非コンテキストの)クラスStringを注入する。 3) 'Dependent'以外のスコープが宣言されていない –

+0

' ip.getMember()。getDeclaringClass() 'を呼び出すと、FQCNのどちらの場合も、InjectionPoint APIのdocの例としても使用されます。私はDeltaspikeの例で、 'bean'が' null'の後にフォローアップコールとしてそれを見ました。 –

答えて

1

と私はまたすぐに(116ビルド)ペーシュ・カショーロサーバー4.1.1.162 #badassfishでそれをテストしました。私も、新しいPayara Server 4.1.1.164 #badassfish(ビルド28)のテストを行った。しかし、プロデューサーBeanのスコープを@ApplicationScopedに変更する必要がありました。デフォルトスコープは機能しませんでした。私の場合は、それも理にかなって:)

injectionPoint.getBean().getBeanClass() 

方法は古いペーシュ・カショーロに私のために働いたが、ない新しいWildFly 10.1.0.Finalと新しいペーシュ・カショーロサーバー4.1.1.164#で(ビルド28)。

Payaraを見ると、現在の新しいバージョン164には、Weld 2.4.0.FinalとWildFly 10.1.0Final使用バージョン2.3.5.Finalが含まれています。どちらのバージョンでも、古典的なコードは機能しません!

結論は古いCDI実装(Weld)では動作します。より新しいWeld(Payara 161で紹介された)では、行動が変わった。これが意図的かどうかはわかりません。

しかし、溶液は

injectionPoint.getMember().getDeclaringClass() 

を使用し

@javax.enterprise.context.ApplicationScoped 

アノテーションとプロデューサBeanをアノテートすることです。

+1

weblogic 12.2.1(CDI 1.1)でテストしましたが、私も同じ問題があります。 weblogic 12.1.3(CDI 1.0)ではうまくいきました。あなたが言ったように、私は 'injectPoint.getMember()。getDeclaringClass()'を使って問題を解決しました – Rouliboy

+0

これはすでに認識されているようです:https://issues.jboss.org/browse/WELD-2339 –

関連する問題