【问题标题】:lookup EJB in member instantiate在成员实例化中查找 EJB
【发布时间】:2013-07-10 07:05:18
【问题描述】:

我有一个问题,将 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: 无法在 SessionBean 类上初始化类

当我将 MyHelper 更改为此时,它起作用了:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 还请注意,他是在无状态 ejb 中直接实例化非托管属性(创建状态)。这是一个很大的禁忌。该值应该被注入(通过容器)或通过@PostConstruct 惰性注入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多