在成员实例化中查找EJB

时间:2013-07-10 07:05:19

标签: java ejb ejb-3.0 stateless-session-bean session-bean

我有一个问题是将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();
   }
}

因为helper类不是EJB,所以我有一个查找方法,称为成员实例化的int。 使用此代码,我在运行时获得了一个异常 java.lang.NoClassDefFoundError:无法在SessionBean类上初始化类

当我改变MyHelper时,它起作用了:

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

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

想知道为什么第一种方式不起作用......

1 个答案:

答案 0 :(得分:1)

这可能是可能的,因为在第一个代码片段中发生JNDI外观时,可能尚未初始化AnotherSessionBean。这意味着SessionBean首先被初始化。在初始化SessionBean时,MyHelper的构造函数被调用。这又被称为尚未加载的AnotherSessionBean的jndi。

这在第二个代码片段中起作用,因为在调用getEjb()时,所有EJB都已初始化。所以JNDI可以找到AnotherSessionBean。