【发布时间】:2015-11-23 22:09:22
【问题描述】:
我有一个 DAO 类捕获 javax.persistence.PersistenceException 包装它们并将其作为检查异常重新抛出。此方法标记为@org.springframework.transaction.annotation.Transactional。
如果我在我的 DAO 中遇到一个异常,比如违反约束,它将被包装在我的自定义异常中,但是 spring 会覆盖我的异常
[tp1415357209-22] o.s.t.i.TransactionInterceptor : Application exception overridden by commit exception
并抛出它自己的org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
通过仅仅记录它并重新抛出它自己的异常来“吞下”我的异常。我怎样才能防止春天这样做?
附:
@Transactional(noRollbackFor = { MyCustomException.class})
不起作用。当然,我确实希望将事务设置为回滚,但我不希望我的异常被春天吞没。
【问题讨论】:
-
一个选项是你捕获 TransactionSystemException 并使用它的 getOriginalException() 来获取你的 PersistenceException 对象。
-
@mohit 这不是我想要的,实际上违反了我的界面与上层的约定。我想将来自底层的任何异常包装到我自己的异常中,并且只将这些异常抛出到上层我只是不明白为什么 spring 会做这样的事情。 JEE 不会发生这种情况,或者我认为在 Spring 中也有一种方法可以告诉它不要吞下我的异常。
-
你用的是哪个spring版本?
标签: spring hibernate spring-transactions