【发布时间】:2012-03-02 17:25:27
【问题描述】:
我有一个企业应用程序(至少)有一个 Web 层(仅 UI)和一个服务层。服务层是所有业务逻辑和当前会话状态,以@Stateful @LocalBean EJB(无 CDI)实现。
就 CDI 而言,这有点类似于 @SessionScoped bean,对吧?
那么,问题来了:
我在 Web 层 (@Named @ConversationScoped) 进行了长时间的对话,并且想要访问有状态的 EJB。 EJB 应该在这个会话的不同控制器(bean)中被访问。我不能这样做:@EJB 因为它将是特定 EJB 类型的不同实例。我必须以某种方式保存对 EJB 的引用。这是我目前的解决方案:
@EJB
private MyEJB _myEJB; // a stateful EJB
@Produces
@Builder // custom quallifier
@ConversationScoped
public MyEJB produceMyEJB() {
return _myEJB;
}
现在我可以在每个会话范围的控制器中访问同一个有状态 EJB 实例,例如 @Inject @Builder MyEJB _myEJB。
它在大多数情况下都有效。但是在一些长期运行的测试中,这个引用是空的,我不知道为什么。
我在 Glassfish 的 server.log 中获得了这个堆栈跟踪:
javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key:
907f0200001f-ffffffffc3388fbb-761
和/或
Cannot load from BACKUPSTORE FOR Key: <907f0200001f-ffffffffc3388fbb-761>
您知道为什么会发生这种情况吗?感谢您的帮助,并为我的英语不好感到抱歉。
【问题讨论】:
标签: java jsf glassfish ejb cdi