noRollbackFor 并不总是处理未经检查的异常(不重复)

2023-12-15

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

这是我的代码。

@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");
    }
}

消费者(非事务性)通过自动装配接口调用此方法。 尽管 noRollbackFor 事务(仅由此方法组成)会回滚。 好吧,我理解有人说“默认情况下,对于任何未选中的情况都是回滚,因此由于默认值没有被覆盖,该规则仍然适用”。但这不应该是真的,因为这意味着 noRollbackFor 是无用的:)我们可以尝试指定 rollbackFor 如上面的评论,希望它会取消“默认”rollbackFor - 但这没有帮助:回滚仍然会发生;看起来这个设置只是添加到“默认”中。最糟糕的是,当 noRollbackFor 和 rollbackFor 覆盖相同的后代异常时,我找不到关于它应该如何工作的精确规范(就像在我的例子中,RuntimeException 与 IllegalArgumentException,谁赢了?)。

好吧,我找到了但官方有一个澄清它说“最强的匹配规则获胜” - 但这似乎并不普遍正确,就像我的情况一样。另外,出于某种原因,他们过于具体:他们说 no-rollback-for="InstrumentNotFoundException" 的字面意思是“除了 InstrumentNotFoundException 之外的任何异常”都将被回滚(但是 InstrumentNotFoundException 的后代呢?)无论如何,它已经过时了:2.5.x,而较新的文档只是说“rollbackFor 列出了要回滚的异常,而 noRollbackFor 列出了不回滚的异常”,我想说,这是一种非常矛盾的方式。

更有趣的是,如果我在其“throws”子句中指定 IllegalArgumentException,上面的代码将停止回滚。是的,我不必这样做,因为它未经检查 - 但如果我这样做, noRollbackFor 似乎终于注意到它并表现得正常!有谁知道什么手册说这应该发生?或者也许这是一个错误?

UPDATE这是spring事务日志(在我的实际代码YargReportTemplateDao$TemplateNotFoundException中到处都是而不是IllegalArgumentException)

1)与“投掷”

[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

您看到的行为与事务处理无关,而是与异常转换有关。默认情况下,当类注释为@RepositorySpring会注册一个PersistenceExceptionTranslationInterceptor这会将异常转换为 Spring 之一DataAccessExceptions。默认情况下,它会转换所有异常,除非抛出的异常在 throws 子句中声明。

此异常翻译发生在TransactionInterceptor这样就永远不会有IllegalArgumentException抛出是因为它已经被翻译成其他东西了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

noRollbackFor 并不总是处理未经检查的异常(不重复) 的相关文章

随机推荐

  • 如何使用 django 将进程置于后台?

    我尝试了 os system os spwanl 等 但效果不佳 我需要从 django 应用程序执行一些后台进程 尝试使用celery 它最初就是为此目的而创建的 并且还支持调度任务
  • JS:导出 Array.prototype

    如果我想向 JavaScript 添加原型Array 有没有办法导出它 以便我可以将所有原型方法放入一个文件中 例如modules prototypes js 可不可能是export Array 或者我会在设置原型之前添加导出吗 如果你的代
  • iOS - 本地通知 - 自定义振动或振动时间更长

    我正在尝试构建一个像闹钟一样工作的 iPhone 应用程序 我正在使用 UILocalNotification Problem 我希望手机振动时间更长一些 但目前它仅振动一次 替代方法 是否可以使用自定义振动模式 http www pcwo
  • 在 bash 中将带有分号 (';') 的值赋给变量

    我试图用 sed 在 unix shell bash 上的字符串中转义 分号 当我直接执行而不将值分配给变量时它会起作用 那是 echo hello sed s 1 g hello 但是 当将上述命令分配给变量时 它似乎不起作用 resul
  • 将插入符号/光标位置设置为字符串值 WPF 文本框的末尾

    我尝试将插入符 光标位置设置为end当我第一次打开窗口时 WPF 文本框中的字符串值 当窗口打开时 我使用 FocusManager 将焦点设置在文本框上 似乎没什么作用 有任何想法吗 请注意 我使用的是 MVVM 模式 并且我的代码中仅包
  • Struts2 中的 NoSuchMethodException

    我有出生日期的文本字段 当用户输入无效日期 例如字符串 时 错误消息成功显示为 fielderror 但在我的控制台中 我收到此错误 java lang NoSuchMethodException Profile setBirthDate
  • jquery ajax 单击时调用,仅有效一次

    我有这个简单的 jquery 代码 单击时 它会获取标签的 URL 加载当前内容旁边的页面 滑动它并删除旧内容 页面的状态与以前完全相同 相同的元素没有额外的类或样式 问题是下一个 ajax 调用不起作用 也许我需要 unbind 一些东西
  • 反应点击处理程序并绑定它

    我有一个反应组件 我在其中迭代列表并创建行 每行都有一个删除按钮 单击删除按钮时 我想传递对该行中元素的引用 var TagTable React createClass onTagDelete function tagName this
  • 将空白节点添加到 Jena 模型

    我正在尝试使用一组现有的三元组填充耶拿本体模型 其中一些包含空白节点 我想忠实地维护这个新模型中的这些空白节点 但我无法找到将它们添加到耶拿模型中的方法 我一直在使用 Statement s ResourceFactory createSt
  • 多个 UIAlertView 问题

    我的代码有问题 我有两个 UIAlertView 代码块 一个带有取消和确定按钮 另一个用于制作 ImagePicker IBAction publicaPeticion if txtPeticion hasText UIAlertView
  • 为什么我在C#中无法设置这个ACL规则?

    我的 C 应用程序在 Vista SP1 上以提升的管理员身份运行 尝试使用以下代码设置以下规则 不会产生任何错误 但目录的 ACL 也不会发生任何更改 我缺少什么 public static void Main string args s
  • Websphere:不强制执行 web.xml 中的安全约束

    我正在尝试在我支持的非常旧的 J2EE 应用程序上启用 SSL 该应用程序在 WebSpehre 6 1 中运行 我已在运行应用程序的 WAS 配置文件中启用应用程序安全性 但下面的 web xml 配置仍然允许用户使用 HTTP 或 HT
  • 如何读取用户写的内容(无需按 Enter 键) - 控制台 C#

    好吧 问题的标题可能有点不对劲 但我没有想到更好的 所以这里是 我想阅读用户输入的 到目前为止 的内容 我需要它像这样工作 用户输入一些所需的数据 然后询问他 她是否想要完整的进度输出或只是结果 当然 我可以调用 ReadLine 并查看他
  • PHP。是否可以将 array_column 与对象数组一起使用

    是否可以通过array column对象数组 我已经实现了ArrayAccess接口 但没有效果 我应该实施另一个吗 class Foo implements ArrayAccess public Id Title public funct
  • 如何为apache+wsgi网站设置LD_LIBRARY_PATH

    我正在尝试在基于 wsgi apache Flask 的网站中使用 python 库 在独立命令脚本中使用该库时 我必须将库路径添加到 LD LIBRARY PATH 所以这适用于独立脚本 export LD LIBRARY PATH us
  • 从字符串中解析多项式系数

    我正在尝试构建一个正则表达式来解析字符串中多项式的系数 我以为我已经找到了解决方案 直到我发现一个特定的示例 我怀疑该示例格式错误 破坏了我的正则表达式 我也不确定我的解决方案是最优雅的 以下是我需要解析的字符串的一些示例 polys 1x
  • 如何在 spigot 1.16.4 中获取玩家的 ping

    我尝试以多种方式使用 java 反射来获取玩家的 ping 值 但在 100 时 它返回 0ms 我已经搜索了很长时间 所以 有人可以帮助我吗 Try 1 public static int getPing Player p try Obj
  • ActualWidth 作为 From WPF 动画的值

    为什么我不能参考ActualWidth作为一个值 我可以在代码中使用它 XAML
  • Javascript 和 ESLint 中的全局变量

    我有多个 javascript 文件 并且在一个文件中定义了一些全局变量 该变量先于其他文件加载 因此 第一个文件之后加载的所有文件都可以访问全局变量 然而 ESLint 将全局变量显示为 未定义 我不想改变 ESLint 的规则 我想找到
  • noRollbackFor 并不总是处理未经检查的异常(不重复)

    我见过很多类似的问题 但它们通常与我的问题无关 这是我的代码 Override class implements interface can also add rollbackFor OutOfMemoryError class here