2

CMTを使用するEJBがあります。このEJBは、JSON JERSEYRESTWebサービスです。このWebサービスは、スタンドアロンのGSONRESTクライアントによって呼び出されます。
このEJBは、以下の順序で1回の変換で以下のクラスを呼び出します。1)DB挿入操作を実行するDBDAOクラス。2)ActiveDirectoryにユーザーを挿入するLDAPクライアントクラス。

例外が発生すると、EJB / Webサービスは500内部サーバーエラーをスローし、コンテナはトランザクションをロールバックします。このエラーをキャプチャし、意味のあるメッセージに変換して、応答オブジェクトの一部としてコンシューマーに送信したいと思います。このEJBロールバック例外をキャッチするにはどうすればよいですか?EJB内でそれをキャッチすると、トランザクションはロールバックされないことがわかりました。EJBロールバック例外をインターセプトしてキャッチするインターセプターはありますか?

以下は私のEJBコードです:

@Interceptors(SpringBeanAutowiringInterceptor.class)
@Stateless(name = "RegistrationServiceImpl", mappedName = "EJB-model-RegistrationServiceImpl")
@Path("registration")
public class RegistrationServiceImpl implements IRegistrationService {
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public RegistrationResponse validateMemberRegInfo(RegistrationRequest request){
        // CALL DB DAO throws DB exception
        // CALL LDAP client throws LDAP exception
    }
}
4

1 に答える 1

1

メソッドが終了するまでトランザクションのコミットは発生しないため、コンテナー管理のトランザクション メソッド内からトランザクションのコミットの失敗をキャッチすることはできません。呼び出し元 (サーブレットなど) で例外をキャッチするか、Bean 管理のトランザクションを使用する必要があります。例えば:

@TransactionManagement(BEAN)
public class RegistrationServiceImpl implements IRegistrationService {
    @Resource UserTransaction userTran;
    public RegistrationResponse validateMemberRegInfo(RegistrationRequest request){
        try {
            userTran.begin();
            // CALL DB DAO throws DB exception
            // CALL LDAP client throws LDAP exception
            userTran.commit();
        } catch (...) {
            ...
        } catch (TransactionRolledbackException e) {
            ...
        }
    }
}
于 2012-10-23T02:48:17.973 に答える