【发布时间】:2017-10-02 12:40:10
【问题描述】:
我一直在阅读有关 EJB 异常处理的内容,这是我目前的理解:
假设 Bean B(服务器)事务属性是必需的:
- 系统异常应作为 EJBException 抛出给调用者。
- 容器拦截EJBException(或任何其他未经检查的异常)将其包装并抛出给调用者
- 如果调用者在事务中运行,则 bean 实例被丢弃并且事务被回滚,调用者将 EJBException 包装在 EJBTransactionRolledBackException 中。
- 如果调用者不在事务中,则 bean 实例将被丢弃,调用者将获得封装在 RemoteException 中的 EJBException。
当我使用调用者 trans 运行它时。属性设置为 REQUIRED 我确实将 EJBException 包装在 EJBTransactionRolledBackException 中。
当我使用调用者 trans 运行它时。属性设置为 NEVER,我在调用者中捕获了原始 EJBException,而不是包含在 RemoteException 中
为什么在第二种情况下我没有收到 RemoteException?
这是我的调用者和服务器 bean 的简化视图:
@Stateless
public class BeanA implements BeanAInterface{
@Override
public void callBeanB() {
BeanBInterface beanBInterface;
try{
beanBInterface = (BeanBInterface) new InitialContext().lookup(BeanBInterface.class.getName());
beanBInterface.getResponse();
} catch (Exception e){
log.error("Caught Exception: " + e);
}
}
}
@Stateless
public class BeanB implements BeanBInterface{
@Override
public void getResponse(){
throw EJBException("Catch me.");
}
}
编辑:
我刚刚读到here,EJBException 被抛出给本地客户端,而 RemoteException 被抛出给远程客户端。在我的示例中,调用方 bean 与服务器 bean 在同一个服务器实例中运行,但它通过服务器 bean 远程接口进行连接。我想我也不清楚远程与本地客户端的定义,但似乎我没有收到 RemoteException,因为我的客户端不是远程的。
【问题讨论】:
标签: java jakarta-ee exception-handling ejb