2012-10-22 75 views
1

我有一個使用CMT的EJB。這個EJB是一個JSON JERSEY REST Web服務。此Web服務是由獨立的GSON REST客戶端調用的 。
該EJB按照以下順序在單個轉換中調用以下類: 1)執行DB插入操作的DB DAO類。 2)在Active Directory中插入用戶的LDAP客戶端類。Catch EJB回滾異常

當發生任何異常時,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 
    } 
} 

回答

1

你抓不到交易從容器管理事務方法中提交失敗,因爲事務提交不會發生,直到該方法結束。您需要在調用方(例如servlet)中捕獲異常,否則您將需要使用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) { 
      ... 
     } 
    } 
}