EJB3.0序列化有状态Bean的句柄

时间:2011-07-01 23:17:24

标签: java java-ee glassfish ejb-3.0

我正在尝试将远程句柄持久化到有状态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中的可序列化句柄?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

  

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

以及更多:

  

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

可能是您在不能使用getEjbMethod的阶段调用getHandle方法。您的会话初始化可能出现问题(我认为ctx属性在您为简单起见而省略的代码中的某处已被初始化)