簡體   English   中英

在客戶端代碼中處理EJBException

[英]handling EJBException in client code

我一直在閱讀有關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.");

     }
    }

編輯:

我在這里僅讀到EJBException被拋出給本地客戶端,而RemoteException被拋出給遠程客戶端。 在我的示例中,調用方Bean與服務器Bean在同一服務器實例中運行,但通過服務器Bean遠程接口進行連接。 我想我對遠程客戶端和本地客戶端的定義也不清楚,但是似乎我沒有得到RemoteException,因為我的客戶端不是遠程的。

確保該容器確實在使用遠程接口,而不是本地接口。
也許您認為您正在呼叫遠程設備,因為您正在指的是遠程設備,但實際上容器對於您將本地呼叫視為“優化”。

我記得我陷入了類似的困境,直到一段時間之后,我才意識到當兩個EJB都在同一VM中時,Jboss將遠程調用視為本地調用。 在我使用遠程接口的情況下,容器未使用按值傳遞(序列化對象),而是傳遞了引用。

因此,我的建議是:確保您處於“遠程方案”中。 嘗試使用兩個jbosses i來使用兩個不同的應用程序服務器,看看是否發生了變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM