【问题标题】:Spring's TransactionInterceptor overrides my ExceptionSpring 的 TransactionInterceptor 覆盖了我的异常
【发布时间】: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


【解决方案1】:

解决方案是使用 rollbackFor 而不是其他属性,这样 spring 就不会吞下我自己的异常

【讨论】:

    【解决方案2】:

    如果你有几个不同的检查异常可以在你的类或方法中引发,你也可以使用通用的异常类

    @Transactional(rollbackFor = Exception.class)
    

    【讨论】:

      【解决方案3】:

      Kotlin 中的示例:

      @Transactional(rollbackFor = [MagicNotAvailableException::class])
      @Throws(MagicNotAvailableException::class)
      fun doMagicOrThrow()
      

      【讨论】:

        猜你喜欢
        • 2011-03-15
        • 1970-01-01
        • 2017-01-23
        • 2023-03-25
        • 2018-12-15
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        相关资源
        最近更新 更多