【问题标题】:Spring hides RuntimeException thrown by a @Transactional methodSpring隐藏了@Transactional方法抛出的RuntimeException
【发布时间】:2017-07-09 23:37:46
【问题描述】:

作为我代码的一部分,@Transactional 注释方法。在某些情况下,该方法会引发自定义异常并执行回滚。每当发生这种情况时,方法调用都会导致 TransactionSystemException 并且无法获取原始自定义异常(这不是异常的根本原因)。

我能否以某种方式访问​​我的方法引发的原始异常? 我可以阻止 spring 抛出 TransactionSystemException,但仍然回滚吗?

@Transactional
public Association create(Long accountId) {
    // if association already exists, throw exception
    throw new ErrorInfoException(ErrorInfo.duplicateAssociation(accountId).info("This Association already exists").build());
}

【问题讨论】:

  • 你能在抛出这些自定义异常的地方添加事务方法吗?
  • @MaciejKowalski 我编辑了其中一种方法。它们都很简单
  • 您如何尝试从 TransactionSystemException 中检索根/原始异常?

标签: java spring spring-boot transactions spring-data-jpa


【解决方案1】:

不确定您如何管理该方法之外的异常,但您需要捕获TransactionSystemException,然后在您的情况下调用getApplicationException(),因为您的自定义异常应首先在堆栈上:

返回在此之前抛出的应用程序异常 交易异常,如果有的话。

如果由于某种原因中间还有一些例外情况,请选择getOriginalException(),根据规范应该:

返回在失败中最先抛出的异常 事务:即应用程序异常(如果有)或 TransactionSystemException 自身的原因。

如果您使用 Exception 的 getCause 方法,那么在这种情况下这可能不是正确的方法。

【讨论】:

  • 不幸的是 ApplicationException 为 null 并且 OriginalException 只是已经是原因的“javax.persistence.RollbackException”。看来我的自定义异常已经消失了。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多