【发布时间】:2019-08-19 17:15:38
【问题描述】:
支持 bean (JSF) 调用 EJB 的方法,在该方法中启动事务。事务由 EJB 中的容器管理。 EJB 的方法可以通过调用setRollbackOnly 使事务无效。如何在 backing bean 中检测到它?
如果 EJB 方法在 EJB 方法中抛出系统异常而不是调用setRollbackOnly,那就很简单了。 setRollbackOnly 比抛出异常有什么优势?
【问题讨论】:
支持 bean (JSF) 调用 EJB 的方法,在该方法中启动事务。事务由 EJB 中的容器管理。 EJB 的方法可以通过调用setRollbackOnly 使事务无效。如何在 backing bean 中检测到它?
如果 EJB 方法在 EJB 方法中抛出系统异常而不是调用setRollbackOnly,那就很简单了。 setRollbackOnly 比抛出异常有什么优势?
【问题讨论】:
您不能直接在 JSF 托管 bean 中注入 EJB 上下文。
只需通过公共方法公开当前事务状态。
@Stateless
public class MyEJB {
@Resource
private SessionContext context;
// related getter / setter
...
public boolean hasRolledBack() {
return context.getRollbackOnly()
}
}
如果事务被标记为回滚,您也可以自己抛出异常。
关于您的第二个问题,事务已被跨国方法边界抛出的异常回滚,但它已在执行流程的后期某处被捕获。 (最好在你无法处理的错误上抛出一个 RuntimeException,这样没人会抓住它)
【讨论】: