spring - 使用 @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 ......
有人已经找到解决方案了吗?
解决方案
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 配置部分找到更多详细信息。
希望这可以帮助。
推荐阅读
- python - 尝试创建分页不和谐嵌入功能
- sql-server - 指数策略 - 表设计每小时数据
- python - 在 RPG 战斗系统中,当我输入“攻击”时,如果我输入“运行”,它就会运行代码
- java - 复制项目后 Eclipse 引用其他项目中的文件
- amazon-web-services - 私有子网中的redshift集群节点有公网IP
- javascript - 重定向后的空 PHP 会话数组
- javascript - 不活动时如何删除css样式
- android - 将我的 Bmi 结果添加到 firebase 数据
- spring-boot - 类 java.time.LocalDateTime 不能转换为类 java.lang.String
- javascript - 如何避免在循环中等待