【问题标题】:handling EJBException in client code在客户端代码中处理 EJBException
【发布时间】: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


    【解决方案1】:

    确保容器确实在使用远程接口而不是本地接口。
    也许您认为您正在调用远程,因为您引用的是远程,但实际上容器正在“优化”您将调用视为本地调用。

    我记得我遇到了类似的问题,直到一段时间后我才意识到当两个 EJB 在同一个 VM 中时,Jboss 将远程调用视为本地调用。 就我而言,当我使用远程接口时,容器没有使用按值传递(序列化对象),而是在传递引用。

    所以我的建议是:确保您处于“远程场景”中。 尝试使用两个不同的应用程序服务器和两个 jboss i,看看是否有变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2018-04-17
      • 2014-05-14
      • 2012-04-30
      • 1970-01-01
      • 2016-09-20
      相关资源
      最近更新 更多