2017-04-03 4 views
1

依存性注入を使用して、いくつかのejb(ステートレスおよびシングルトン)からイベントを起動する必要があります。私はSpring、Guiceなどを使用していません。 問題はgetInstance()でメソッドを呼び出すときにBeanの1つでNPEを取得することです。ここでは、コードスニペットは次のとおりです。ここでシングルトンCDI @Injectヌルポインタ例外

@Stateless 
@LocalBean 
public class ControllerStartStop { 
    @Inject 
    private Event<SomeWebMessage> webEvent; 

    public String startCircle(String passwordP, String passwordH) { 
    ......... 
    String res = "some msg"; 
    webEvent.fire(new SomeWebMessage(res, 0)); // this works fine 
    MainDay.getInstance().startDay();  // NullPointerException 

はMainDayシングルトンです:

@Singleton 
public class MainDay { 
    private static final MainDay mDay = new MainDay(); 
    public static MainDay getInstance() { return mDay ; } 

    @Inject 
    private Event<SomeWebMessage> webEvent; 

    public void startDay() { 
     String s = new String("MainDay"); 
     webEvent.fire(new SomeWebMessage(s,0)); // NullPointerException 

beans.xmlのは、META-INFにあります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
          http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.1" bean-discovery-mode="all"> 

</beans> 

私はからイベントを発生時に何のNPEはありませんSender(@Schedule(時= ""、分= ""、秒= 1)によってMainDay.initDS()のような静的メソッドの呼び出しまたはstartDay "/10")*。 私は@Singletonはあなたはそれを自分で作成しないでくださいすなわち、コンテナは(EJBまたはCDIは、それがどの注釈に依存)のインスタンスを管理することを意味している理由

答えて

0

注意が何であるか見当がつかない。

private static final MainDay mDay = new MainDay();でインスタンスを作成した場合、コンテナによる注入は行われないため、webEventはnullになります。コンテナはそのインスタンスを知らず、@Inject MainDayを他の場所に使用すると、別のインスタンスを生成する可能性が非常に高いです。

したがってちょうど(あなたがする必要がある場合やルックアップ)を直接注入を使用します。私はMainDay.initDSのような静的メソッドの呼び出しからのイベントを発生する場合

class ControllerStartStop { 
    @Inject 
    private MainDay mDay; 

    ... 
    public String startCircle(String passwordP, String passwordH) { 
    ... 
    String res = "some msg"; 
    webEvent.fire(new SomeWebMessage(res, 0)); 
    mDay.startDay();  
    ... 
    } 

は何のNPEありません()またはメソッドstartDayは、()Sheduler(@Schedule(時間= ""、分= ""、第二= "/ 10")*によって呼び出されます。私はそれはだあなたのコードを知らなくても

理由が何であるか見当がつかないあなただけの推測ですが、ここにMainDayを注入しているとか、CDI/JNDIの参照を使っていると仮定します。コンテナーはインスタンスが存在しない場合は作成し、Eventオブジェクトを挿入します。

+0

ありがとう、トーマス!その今はっきりとそれが動作します:) – Buch

0

NPE 1:

は、標的化さEJB MainDayがイベントを "観察" し、そのstartDay()メソッドを呼び出すことではないでしょうか?

public void onEvent(@Observes SomeWebMessage event) { 
    // if (...) 
     startDay(); 
} 

したがって、スタティックgetInstance()メソッドは必要ありません。

NPE 2:

@Inject Event<SomeWebMessage> webEvent; 

依存性注入(DI)だけがを行う場合ではないは手動でコンストラクタnew MainDay()を呼び出すが、指名手配Beanのインスタンスを注入し、DIコンテナハンドルの建設を聞かせて、動作します。

しかし、@Observes(javax.enterprise.event。あなたはとにかくすべての臭いのあるstaticを取り除くことができるはずです。

+0

ControllerStartStop、MainDayで焼成するイベントを観察し、多分1つのまたは2の他、別の1つのシングルトンがあります: '@Singleton パブリッククラスLongPollingNotifier { \t民間最終キューピア=新しいConcurrentLinkedQueueは、 (); @Asynchronous \tます。public void notifyPeers(@Observes SomeWebMessage SWM)... ' は、このアプローチは大丈夫ですか? – Buch

+0

はい、複数の独立したオブザーバーを持つことができます。 –

関連する問題