春季引导中的事务同步



我有一个小的春季启动应用程序,带有 spring-boot-starter-webspring-boot-starter-data-jpapostgresql作为依赖项。

我能够使用@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中的更好的应用程序事件。

最新更新