首页 > 解决方案 > 使用 @JpaDataTest 测试 Spring 批处理

问题描述

我正在使用 Spring Batch 4.0,并且正在尝试测试我的批次。我会将嵌入式数据库 h2 与 @JpaDataTest 一起使用,但它不起作用。当我添加此注释时出现错误

java.lang.IllegalStateException:在 JobRepository 中检测到现有事务。请修复此问题并重试(例如,从客户端删除 @Transactional 注释)。

@Test 上的 @Transaction(propagation=Propagation.NEW_REQUIRED) 不起作用。

我试图从 @JpaDataTest 复制每个注释并删除 @Transaction

@BootstrapWith(SpringBootTestContextBootstrapper.class)
@OverrideAutoConfiguration(enabled = false)
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration

但是当我这样做时,我失去了 EntityManager ......

有人已经找到解决方案了吗?

标签: springspring-data-jpaspring-batchspring-test

解决方案


java.lang.IllegalStateException:在 JobRepository 中检测到现有事务。请修复此问题并重试(例如,从客户端删除 @Transactional 注释)。

当您尝试在外部事务上下文(示例中的测试)中运行 Spring Batch 代码(驱动事务)时,会发生此错误。

与其添加@Transaction(propagation=Propagation.NEW_REQUIRED)测试,不如尝试停用事务,让 Spring Batch 驱动事务。例如,使用:

@Transaction(propagation = Propagation.NOT_SUPPORTED)

我试图从@JpaDataTest 复制每个注释并删除@Transaction [...] 但是当我这样做时,我丢失了EntityManager ...

您需要确保 Spring Batch 使用您想要的事务管理器(我猜是JpaTransactionManager您的情况)来驱动其事务。为此,您需要BatchConfigurer在批处理配置中定义一个类型的 bean 并覆盖getTransactionManager。这是一个例子:

@Bean
public BatchConfigurer batchConfigurer() {
    return new DefaultBatchConfigurer() {
            @Override
            public PlatformTransactionManager getTransactionManager() {
                    return new MyTransactionManager();
            }
    };
}

您可以在参考文档的Java 配置部分找到更多详细信息。

希望这可以帮助。


推荐阅读