我一直在阅读有关EJB异常处理的内容,这是我目前的理解:
假设Bean B(服务器)事务属性是必需的:
当我用调用者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远程接口连接。我想我不清楚远程vs本地客户端的定义,但似乎我没有得到RemoteException,因为我的客户端不是远程的。
答案 0 :(得分:0)
确保容器确实使用的是远程而不是本地接口 也许你认为你正在呼叫遥控器,因为你正在推荐的遥控器,但实际上容器是"优化"对你来说,就像当地一样对待这个电话。
我记得我遇到过类似的事情,只有一段时间后我才意识到Jboss正在处理远程调用,因为当两个EJB都在同一个VM中时它们是本地调用。 在我的情况下,当我使用远程接口时,容器没有使用传值(序列化对象),而是传递了引用。
所以我的建议是:确保你处于一个"远程场景"。 尝试使用两个不同的应用程序服务器两个jbosses i,看看是否有变化。