0

EJB への参照を非 EJB クラス (EJB で静的メンバーとして使用される) からのメンバーとして保存するという問題があります。

私が持っていると言う

@EJB(...)
@Stateless
public Class SessionBean implements MySession{
   protected static MyHelper helper = new MyHelper();
}

public Class MyHelper{
   protected AnotherSessionBean ejb = lookup("jndi");

   public void doSomething(){
        ejb.foo();
   }
}

ヘルパー クラスは EJB ではないため、インスタンス化するメンバーの int と呼ばれるルックアップのメソッドがあります。このコードを使用すると、実行時に例外 java.lang.NoClassDefFoundError: Could not initialize class on the SessionBean クラスが発生しました。

MyHelper をこれに変更すると、うまくいきました:

public Class MyHelper{
   protected AnotherSessionBean getEjb(){
     return (AnotherSessionBean)lookup("jndi");
   }

   public void doSomething(){
        getEjb().foo();
   }
}

なぜ最初の方法がうまくいかなかったのか疑問に思っています...

4

1 に答える 1

1

これは、最初のコード スニペットで JNDI ルックが発生したときに、AnotherSessionBean が初期化されていない可能性があるためです。つまり、SessionBean が最初に初期化されていました。SessionBean の初期化中に、MyHelper のコンストラクターが呼び出されました。これは、まだロードされていない AnotherSessionBean の jndi と呼ばれます。

getEjb() が呼び出されるまでに、すべての EJB がすでに初期化されているため、これは 2 番目のコード スニペットで機能しました。したがって、JNDI は AnotherSessionBean を見つけることができます。

于 2013-07-12T06:06:17.390 に答える