EJB 3.0如何包装异常以便客户端可以处理它?

时间:2011-03-23 17:18:58

标签: java exception glassfish ejb

得到了Ejb

@Stateless
@Local
public class UserManagerBean implements UserManagerBeanLocal {
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Long registerUser(User user) throws UserAlreadyExistException {
        return userManagerDao.createUser(user);                     
    }
}

UserManagerDao捕获数据库异常(或所有异常)并将其重新抛出到UserManagerBean。

@ApplicationException(rollback=true)
public class UserAlreadyExistException extends Exception {

}

由于某种原因,此异常被包装到EJBException并抛出到客户端。这就是我在客户端看到的。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.ejb.EJBException: Transaction aborted

javax.ejb.EJBException: Transaction aborted


javax.transaction.RollbackException: Transaction marked for rollback.

root cause

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException

我想要实现的是在客户端捕获应用程序异常(UserAlreadyExistException),但容器包装它我不能

刚开始学习j2ee6。使用glassfish 3.0。我错过了什么吗?

更新

很抱歉,我意识到问题是什么,我抓住并在我的dao-layer中重新抛出EntityManager.persist方法的异常,实际上没有抛出任何异常,因为持久化contexted在方法结束时被刷新,而不是持久化调用。这意味着我甚至没有发现这个异常

但实际上它并没有解决我的问题,我不明白我应该在哪里抛出异常,因为这两种方法都是事务性的。

1 个答案:

答案 0 :(得分:0)

你应该在事务期间调用EntityManager的flush方法来捕获DatabaseException并抛出你自己的异常。