我正在一个项目中使用Spring云任务批处理
。我计划对任务中的业务数据和Spring审计数据使用不同的数据源。所以我配置了如下内容:
@Bean
public TaskConfigurer taskConfigurer() {
return new DefaultTaskConfigurer(this.singletonNotExposedSpringDatasource());
}
@Bean
public BatchConfigurer batchConfigurer() {
return new DefaultBatchConfigurer(this.singletonNotExposedSpringDatasource());
}
而主数据源是通过JpaBaseConfiguration
自动配置的。
当SimpleBatchConfiguration
DefaultBatchConfigrer
公开一个PlatformTransactionManager
bean时,问题就出现了,因为JpaBaseConfiguration
在PlatformTransactionManager
上有一个@SittionalOnMissingBean
。因此Batch的PlatformTransactionManager
绑定到spring.datasource
发生。
到目前为止,这似乎是因为这个错误造成的
因此,我试图模仿JpaBaseConfiguration
的功能,在我的业务数据源/entityManager上定义自己的PlatformTransactionManager
。
@Primary
@Bean
public PlatformTransactionManager appTransactionManager(final LocalContainerEntityManagerFactoryBean appEntityManager) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(appEntityManager.getObject());
this.appTransactionManager = transactionManager;
return transactionManager;
}
注意我必须用transactionManager
以外的名称来定义它,否则Spring
会找到2个bean并抱怨(不管@Prime!
)
但现在有趣的部分来了。运行测试时,一切都运行顺利,测试完成,并且为业务和Batch/Task的数据库正确创建了DDL
,数据库读取工作完美无瑕,但业务数据不会在我的测试数据库中持久化,因此最终assertThats
在计数时失败。如果我在我的测试中@Autowire
PlatformTransactionManager或ntityManager
,一切都表明它们是正确的。但是,如果我在entityRepository.save
中进行调试,并执行org.springframework.transaction.interceptor.TransactionAbooSupport.currentTransactionstatus()
,则似乎Batch的
配置中的DatasourceTransactionManager
被覆盖,因此我的自定义公开PlatformTransactionManager
未被使用。
因此,我想这不是我的PlatformManager作为主要的问题,而是有什么东西正在配置我的JPA层TransactionInterceptor
,以使用非主要但transactionManager
命名的批处理bean。
我还尝试让我的@Configuration
实现TransactionManagementConfigrer并覆盖PlatformTransactionManager annotationDrivenTransactionManager()
但仍然没有运气
因此,我想我要问的是,是否有办法为JPA层配置主TransactionManager。
当SimpleBatchConfiguration DefaultBatchConfigurer公开PlatformTransactionManager bean时,就会出现问题,
正如你提到的,这确实是第2788批报告的情况。我们正在探索的解决方案是,仅当Spring Batch创建事务管理器bean时,才公开它。
与此同时,您可以设置属性spring.main.allow-bean-定义-覆盖=true
以允许bean定义覆盖,并设置您希望Spring Batch与BatchConfigrer#getTransactionManager
一起使用的事务管理器。在您的情况下,它类似于:
@Bean
public BatchConfigurer batchConfigurer() {
return new DefaultBatchConfigurer(this.singletonNotExposedSpringDatasource()) {
@Override
public PlatformTransactionManager getTransactionManager() {
return new MyTransactionManager();
}
};
}
希望这有帮助。
我正在尝试了解如何使用Spring。 我试着效仿这个例子。但是,当我从Eclipse启动Tomcat时,我得到了以下错误: 这是DispatcherServlet的相关代码。xml salvaUtente()是一种方法,我将在其中处理多个插入(现在仍然是exmpty)。
对于条件sessionFactory beans,我将Autowired注释中的'required'参数设置为false,以防止spring抛出NoSuchBeanDefinitionException,但对于@Transactional我该怎么办? 配置类 事务性方法 我希望spring跳过条件transactionManager bean在某些情况下对它们不是由条件创建的bean进行验证。
我在存储库类中有一个方法,标记为,该方面正在执行,如stacktrace中所示,但抛出的异常是“Transaction required exception” 电磁场: 交易: 我真的要疯了,任何帮助都会很好。 似乎,有一个事务,它被检查为完成,加入事务失败,所以它标记为仅回滚,因为它不能加入它。
我正在尝试使用VSTSGit作为我的配置repo。 这是我的application.yml(隐藏或删除的敏感信息)
为了在 JAX-RS/Jersey 应用中 实现 Jersey Spring 3 DI 的支持,请将上述模块添加到 class-path 中。
问题内容: 我仍在尝试围绕@Transactional的工作原理。 我在Service类的方法上有注释,而在Repository类中的方法上有注释。带注释的方法是否适用于带注释的存储库中的方法? 我的理解: 在没有数据的类的方法上,将数据写入数据库,而使用时,则将数据写入数据库。 修改查询 修改方法签名只能返回,或者 更新查询必须是事务性的,标记为 Spring Data将删除所有未刷新的未处理更