2

我有一个使用 CMT 的 EJB。此 EJB 是 JSON JERSEY REST Web 服务。此 Web 服务由独立的 GSON REST 客户端调用。
此 EJB 按以下顺序在单个事务中调用以下类: 1) 执行 DB 插入操作的 DB DAO 类。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
    }
}
4

1 回答 1

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) {
            ...
        }
    }
}
于 2012-10-23T02:48:17.973 回答