在intellij中运行并执行jar时的细微差异

时间:2017-11-22 20:35:09

标签: spring-boot intellij-idea gradle kotlin

我的想法已经不多了......

我的弹簧启动应用程序在indellij中运行并且 gradle idea插件已应用 apply plugin:'idea')时表现良好。 一旦我从 build.gradle 中删除插件,它的行为与使用 java -jar app.jar 执行的应用程序类似 - 存在微妙但重要的区别,下面的描述。

我有以下情况,当前tx由于某些异常而失败,tx被标记为仅回滚,异常被捕获并且其处理包括使用 TransactionSynchronizationManager.registerSynchronization (新tx)。

代码在intellij中使用idea插件工作正常,当我删除插件声明或使用 java -jar 注册进程(post tx failure task)运行spring boot jar时失败,异常:

Caused by: java.lang.IllegalStateException: Transaction synchronization is not active
at org.springframework.transaction.support.TransactionSynchronizationManager.registerSynchronization(TransactionSynchronizationManager.java:291) ~[spring-tx-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]

顺便说一下,如果重要的话,代码就在kotlin中。 有什么想法吗?

更新

我认为存在某种竞争条件,因为在调试模式下,即使没有想法插件,应用也会按预期运行(注册过程成功)。

1 个答案:

答案 0 :(得分:0)

我解决了我的问题,根本原因是非常令人惊讶的......

显然正确处理自定义Spring注释存在问题。 应该打开新事务的方法没有使用标准的@Transactional注释进行注释,而是使用自定义的特定于应用程序的注释(带有自定义tx设置的@Transactional)。调试会话显示新的tx没有打开。而已!内联自定义注释几乎解决了一个问题。 我检测到的另一个缺陷是一个不是 open 的函数,非常奇怪,因为函数不是事务入口点(som进一步调用)。

Kotlin编译器错误? 无论如何,经验教训 - 注意自定义注释行为;刷新有关最终/开放规则的知识。