当前位置: 首页 > 知识库问答 >
问题:

NorollBack,因为它不总是处理未检查的异常(不是重复的)

孟佑运
2023-03-14

我见过很多类似的问题,但它们通常与我的问题无关。

@Override //class implements interface
//can also add "rollbackFor = OutOfMemoryError.class" here, to no avail
@Transactional(noRollbackFor = IllegalArgumentException.class)
public ReportTemplate getByCode(final String code)
  //throws IllegalArgumentException - see question text
{
    if(code == null) {
        throw new IllegalArgumentException("ss");
    }
}

嗯,我只能找到一个官方澄清,它说“最强匹配规则获胜”--但这似乎不像我的情况那样普遍适用。此外,出于某种原因,它们过于特定:它们说no-rollback-for=“InstrumentNotFoundException”字面意思是,“InstrumentNotFoundException以外的任何异常”都将被回滚(但是InstrumentNotFoundException的后代呢?)不管怎样,它已经非常过时了:2.5.x,更新的文档只是说“rollbackfor列出了要回滚的异常,而noRollbackFor列出了不能回滚的异常”,我会说,这是一种非常矛盾的方式。

更有趣的是,如果我在上面的“throws”子句中指定了IllegalArgumentException,那么上面的代码将停止回滚。是的,我没有必要,因为它是不受控制的--但如果我这样做了,noRollbackFor终于似乎注意到了它,并表现得很好!有人知道手册上说这应该发生什么吗?也可能是虫子?

这里更新的是spring事务日志(在我的实际代码YargreportTemplateDAO$TemplateNotFoundException中,到处都是,而不是IllegalArgumentException)

[qtp22373939-44] TRACE org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [ru.it.p321.dao.YargReportTemplateDaoImpl.getByCode] after exception: ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[pool-28-thread-1] DEBUG org.springframework.transaction.jta.JtaTransactionManager - Initiating transaction commit
[qtp22373939-44] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[qtp22373939-44] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Winning rollback rule is: NoRollbackRuleAttribute with pattern [ru.it.p321.dao.YargReportTemplateDao$TemplateNotFoundException]

2)没有“扔”

[qtp21176461-48] TRACE org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [ru.it.p321.dao.YargReportTemplateDaoImpl.getByCode] after exception: org.springframework.dao.InvalidDataAccessApiUsageException: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION; nested exception is ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on org.springframework.dao.InvalidDataAccessApiUsageException: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION; nested exception is ru.it.p321.dao.YargReportTemplateDaoImpl$1: Yarg template was not found for given code: ITORG_REJECT_NOTIFICATION
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Winning rollback rule is: null
[qtp21176461-48] TRACE org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - No relevant rollback rule found: applying default rules

共有1个答案

公西志文
2023-03-14

您看到的行为与事务处理无关,但与异常转换有关。默认情况下,当用@repository注释一个类时,Spring将注册一个PersistenceExceptionTranslationInterceptor,它将异常转换为SpringDataAccessException的异常之一。默认情况下,它翻译所有异常,除非在throws子句中声明了引发的异常。

这个异常转换发生在TransactionInterceptor之前,这样就不会抛出IllegalArgumentException,因为它已经被转换成了其他内容。

 类似资料:
  • 假设您有一个第三方库,它公开了下一个接口。 代码无法编译,因为Function不知道如何处理由domap声明的CheckedException。我想出了两个可能的解决方案。 解决方案#1-包装调用 解决方案#2-编写实用程序方法

  • 我正在解码一个响应体,我得到了错误: 我在Udemy上学习颤振教程时,正在尝试使用API。教程说要使用https://javiercbk.github.io/json_to_dart/将JSON转换为Dart。我把JSON从https://www.openbrewerydb.org/并将其转换为Dart,但我遇到的问题是,当我尝试解码API时,我得到了未处理的错误异常:“List”类型不是“Map

  • 我对使用颤振和特定于平台的代码非常陌生,所以如果这是一个愚蠢的问题,请原谅我。我正在使用一个事件通道将数据从android端返回到Flatter。我正在返回一份清单 但是,当我试图添加它时,它给出了一个异常,“未处理的异常:类型'列表'不是类型'列表'的子类型 这是我要将贴图对象添加到的列表。 列表 这是我的添加代码。忽略print语句。 我尝试过像cast或from这样的方法,但它对我不起作用,

  • 问题内容: 在一个教程中,我发现 您的代码无法处理Unchecked Exception, 即我们不能使用块,示例是类似的异常,但是可以使用try / catch块处理这些异常。我认为我不清楚这个概念! 我也认为throw关键字只能与block.can一起使用吗? 问题答案: 已检查和未检查的异常之间的唯一区别是,必须使用捕获或在方法签名中声明 已 检查的异常,而对于未检查的异常,这是可选的。 您

  • 问题内容: 通常,如果有任何类extends ,它将成为检查异常。还扩展了Exception。那么它是如何? 难道他们在这种特殊情况下会在 编译器中 自定义检查? 编辑: 我对已 检查的v / s未检查的异常 以及它们的优缺点等有适当的了解。我不接受它们之间的区别。 问题答案: 在规范的第11.1.1节中有明确规定: 及其所有子类共同是 运行时异常类 。 在 未经检查的异常类 是运行时异常类和错误

  • 问题内容: 我想知道为什么spring只处理未检查的异常.....谁能解释这背后的原因是什么。 Spring使用的任何设计模式都可以避免检查异常? 问题答案: Spring使用的任何设计模式都可以避免检查异常? 不是设计模式,而是 异常处理的最佳实践 。 考虑下面的代码: 上面的代码有什么问题? 引发异常后,将暂停正常程序执行,并将控制权转移到catch块。catch块捕获异常并抑制它。在catc