我有一个问题是将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();
}
}
想知道为什么第一种方式不起作用......
答案 0 :(得分:1)
这可能是可能的,因为在第一个代码片段中发生JNDI外观时,可能尚未初始化AnotherSessionBean。这意味着SessionBean首先被初始化。在初始化SessionBean时,MyHelper的构造函数被调用。这又被称为尚未加载的AnotherSessionBean的jndi。
这在第二个代码片段中起作用,因为在调用getEjb()时,所有EJB都已初始化。所以JNDI可以找到AnotherSessionBean。