我有一个抛出应用程序异常并返回true的方法。我想知道是否必须显式调用ejbContext.setRollbackOnly()?
文档here表示当异常标记为rollback = true时,我们无需调用EjbContext的setRollbackOnly。
在我的例子中,我捕获了一个ApplicationException,其rollback属性设置为true。然后我显式调用ejbContext.setRollbackOnly()因为我在catch块中抛出另一个异常,这个异常将传播到客户端。以下是我的代码段
try {
....
} catch (XYZDirectoryException e) { // ApplicationException marked as rollback=true
ejbContext.setRollbackOnly(); // Is this necessary?
// log exception trace
throw new ServerInternalException("Something bad happened. Please try again or contact administrator. Check logs for more details"); // ApplicationException marked as rollback=false
}
答案 0 :(得分:2)
如果异常刚刚创建并抛出,则异常不会导致异常。必须从其中一个EJB事务方法抛出它才能被EJB实例周围的事务代理捕获,否则,容器完全不知道异常,因此不会回滚:
public void someEjbTransactionalMethod() {
// will cause a rollback
throw new XYZDirectoryException();
}
public void someOtheEjbTransactionalMethod() {
// will NOT cause a rollback
try {
throw new XYZDirectoryException();
}
catch (XYZDirectoryException) {
...
}
}
因此,在您的情况下,由于异常不跨越任何事务EJB方法的边界,容器不会意识到此异常,并且不会回滚,除非您抛出另一个" rollback = true"来自catch块的异常,或者明确地将事务标记为rollbackOnly。