得到了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在方法结束时被刷新,而不是持久化调用。这意味着我甚至没有发现这个异常
但实际上它并没有解决我的问题,我不明白我应该在哪里抛出异常,因为这两种方法都是事务性的。
答案 0 :(得分:0)
你应该在事务期间调用EntityManager的flush方法来捕获DatabaseException并抛出你自己的异常。