我一直在阅读有关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来使用两个不同的应用程序服务器,看看是否发生了变化。

07-24 15:01