我有一个小的春季启动应用程序,带有 spring-boot-starter-web
, spring-boot-starter-data-jpa
和 postgresql
作为依赖项。
我能够使用@Transactional
注释,并使用JPA将实体获取并保存到数据库中。但是,如果我通过注册同步添加afterCommit
/afterCompletion
钩子,则会给出一个IllegalStateException
,说Transaction synchronization is not active
。
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//this doesn't get called
log.info("do something here");
}
});
执行TransactionSynchronizationManager.initSynchronization();
摆脱了错误,但是挂钩不会被调用(例如:afterCommit
挂钩即使交易已承诺也不会被调用。(
有关如何调试此问题的任何线索?
事实证明,我忘记了包含用于创建具有 @transactional注释的bean的aop-proxies的构建插件。
在没有此插件的情况下,不会生成代理,并且代码将在非交易中运行;除了它进入JpaRepository
方法时,它将在呼叫期间创建短暂的交易(例如save
/findAll
/delete
(。
这是我错过的插件,包括我的pom.xml(这是由Spring initializr(https://start.spring.io/(在POM输出中生成的,但我首先没有注意到它,并且没有将其复制到我的pom(
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
我认为您需要@TransactionalEventListener
注释。它支持the forter_commit,after_rollback,after_completion,after_commit和after_rollback。
本文中的更多信息:春季框架4.2中的更好的应用程序事件。