我一直在阅读有关EJB异常处理的信息,到目前为止,这是我的理解:
假设需要Bean B(服务器)事务属性:
系统异常应作为EJBException抛出给调用方。
容器拦截EJBException(或任何其他未经检查的异常)将其包装并将其抛出给调用方
如果调用方在事务中运行,则该Bean实例将被丢弃,而该事务将被回滚,则调用方将获得包装在EJBTransactionRolledBackException中的EJBException。
如果调用方不在事务中,则将丢弃该Bean实例,则调用方将获取包装在RemoteException中的EJBException。
当我使用caller trans运行它时。属性设置为REQUIRED我确实将EJBException包装在EJBTransactionRolledBackException中。
当我使用caller 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,因为我的客户端不是远程的。
最佳答案
确保该容器确实在使用远程接口,而不是本地接口。
也许您认为您正在呼叫远程设备,因为您正在指的是远程设备,但是实际上,对于您将呼叫视为本地呼叫,容器实际上正在“优化”。
我记得我陷入了类似的困境,直到一段时间之后,我才意识到当两个EJB都在同一VM中时,Jboss将远程调用视为本地调用。
在我使用远程接口的情况下,容器未使用按值传递(序列化的对象),而是传递了引用。
因此,我的建议是:确保您处于“远程方案”中。
尝试使用两个jbosses i来使用两个不同的应用程序服务器,看看是否发生了变化。