我有一个使用CMT的EJB。此EJB是JSON JERSEY REST Web服务。这个网络服务是 由独立的GSON REST客户端调用 此EJB在以下序列的单个转换中调用以下类: 1)DB DAO类,它执行DB插入操作。 2)在Active Directory中插入用户的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
}
}
答案 0 :(得分: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) {
...
}
}
}