【问题标题】:EJB3.0 Serializing a handle to a Stateful BeanEJB3.0 序列化有状态 Bean 的句柄
【发布时间】:2011-07-01 23:17:24
【问题描述】:

我正在尝试将远程句柄持久保存到有状态 EJB3.0 bean。定义了这个 bean 的接口:

@Remote
public interface Hello extends Serializable {
     Handle getHandle();
     void sayHello();
}

实现是:

@Stateful
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class HelloBean implements Hello {

    @Resource
    private SessionContext ctx;

    @Override
    public Handle getHandle() {
          try {
              return ctx.getEJBObject().getHandle();
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
    }

    @Override
    public Handle sayHello() {
        System.out.println("hello");
    }
}

根据 EJB 规范,这应该为我提供一个可序列化的句柄。但相反,我得到:

Caused by: java.lang.IllegalStateException: EJBObject not available
    at com.sun.ejb.containers.EJBContextImpl.getEJBObject(EJBContextImpl.java:328)
    at com.zzz.zzz.HelloBean.getHandle(WorkHolderBean.java:125)
    ... 75 more

我不确定我是否理解我做错了什么......所有有状态的 bean 都应该有一个可序列化的句柄。在 EJB3.0 中是否有一种“正确”的方式来获取可序列化句柄?

【问题讨论】:

    标签: java jakarta-ee glassfish ejb-3.0


    【解决方案1】:

    getEJBObject 不适用于 EJB 3.0 编程模型。您需要使用 @RemoteHome 并实现 EJBHome/EJBObject。

    【讨论】:

      【解决方案2】:

      此异常似乎与序列化问题无关。从 J2EE API Reference 你可以阅读:

      IllegalStateException - 如果在实例处于不允许实例调用此方法的状态时调用此方法,或者如果实例没有远程接口,则抛出该异常。

      还有更多:

      会话企业 Bean 的实例可以在 PostConstruct 或 ejbCreate 与 PreDestroy 或 ejbRemove 方法之间的任何时间调用此方法,包括在这些方法中。

      可能是您在无法使用 getEjbMethod 的阶段调用 getHandle 方法。也许您的 Session 初始化出了点问题(我想 ctx 属性在您为简单起见而省略的代码中的某处被初始化)

      【讨论】:

      • 这个答案似乎是猜测?根据 EJB 规范中允许的操作表,getHandle 显然是允许从业务方法中使用的。
      猜你喜欢
      • 1970-01-01
      • 2012-04-22
      • 2015-05-15
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2011-04-26
      • 2012-10-06
      • 2015-10-03
      相关资源
      最近更新 更多