2012-10-22 8 views
1

나는 CMT를 사용하는 EJB를 가지고있다. 이 EJB는 JSON JERSEY REST 웹 서비스입니다. 이 웹 서비스는 독립 실행 형 GSON REST 클라이언트가 호출하는 입니다.
이 EJB는 시퀀스 아래의 단일 변환에서 클래스 아래를 호출합니다. 1) DB 삽입 작업을 수행하는 DB DAO 클래스. 2) Active Directory에 사용자를 삽입하는 LDAP 클라이언트 클래스.catch EJB 롤백 예외

예외가 발생하면 EJB/웹 서비스는 500 내부 서버 오류 을 발생시키고 컨테이너는 트랜잭션을 롤백합니다. 이 오류를 캡처하여 의미있는 메시지로 변환하고 응답 개체의 일부로 소비자에게 보내려합니다. 이 EJB 롤백 예외를 어떻게 잡을 수 있습니까? EJB 내부에서 트랜잭션을 catch하면 트랜잭션이 롤백되지 않는다는 것을 알게되었습니다. 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

:

다음은 내 EJB 코드입니다. 호출자 (예 : 서블릿)에서 예외를 catch해야하거나 빈 관리 트랜잭션을 사용해야합니다. 예 :

@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) { 
      ... 
     } 
    } 
} 
관련 문제