在客户端代码中处理EJBException

时间:2017-10-02 12:40:10

标签: java java-ee exception-handling ejb

我一直在阅读有关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远程接口连接。我想我不清楚远程vs本地客户端的定义,但似乎我没有得到RemoteException,因为我的客户端不是远程的。

1 个答案:

答案 0 :(得分:0)

确保容器确实使用的是远程而不是本地接口 也许你认为你正在呼叫遥控器,因为你正在推荐的遥控器,但实际上容器是"优化"对你来说,就像当地一样对待这个电话。

我记得我遇到过类似的事情,只有一段时间后我才意识到Jboss正在处理远程调用,因为当两个EJB都在同一个VM中时它们是本地调用。 在我的情况下,当我使用远程接口时,容器没有使用传值(序列化对象),而是传递了引用。

所以我的建议是:确保你处于一个"远程场景"。 尝试使用两个不同的应用程序服务器两个jbosses i,看看是否有变化。