でないEJBExceptionを扱う:私はEJB例外処理について読んでいると、これはこれまでのところ私の理解であるクライアントコード
は、トランザクション属性が必要なビーンB(サーバー)を想定します。
- システム例外はあるべき呼び出し側にEJBExceptionとしてスローされます。
- コンテナを持たないEJBException(または任意の他の未確認の例外)をインターセプトは、発信者がトランザクション内で実行されている場合、Beanインスタンスは破棄取得し、トランザクションがロールバックされます、発信者が包ま持たないEJBExceptionを取得し、それをラップし、発呼者
- にそれをスローEJBTransactionRolledBackExceptionの内部にあります。
- 呼び出し元がトランザクション内に存在しない場合、Beanインスタンスが破棄されると、呼び出し側はRemoteException内でラップされたEJBExceptionを取得します。
私はそれを呼び出し元トランスで実行します。属性が必須に設定されています。EJBExceptionがEJBTransactionRolledBackExceptionの内部にラップされています。
私はそれを呼び出し元のトランスで実行します。属性がNEVERに設定されていない場合、RemoteExceptionでラップされていない元のEJBExceptionを呼び出し元でキャッチします。
2番目のケースでRemoteExceptionが発生しません。
は、ここに私の発信者とサーバー豆の簡略図です:
@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.");
}
}
EDIT:
私はちょうど持たないEJBExceptionがリモートクライアントにローカルクライアントとはRemoteExceptionにスローされhereをお読みください。私の例の呼び出し側Beanは、サーバーBeanと同じサーバーインスタンスで実行されていますが、サーバーBeanのリモートインターフェイス経由で接続しています。リモートクライアントとリモートクライアントのどちらの定義も明確ではないと思いますが、リモートクライアントではないためRemoteExceptionが表示されないようです。