引入@EnableBatchProcessing注解后DataSourceTransactionManager Bean未创建
问题分析
引入@EnableBatchProcessing后,Spring Batch会自动注册一个PlatformTransactionManager类型的事务管理器bean,但你的CustomBatchConfigurer中getTransactionManager()方法仅返回DataSourceTransactionManager实例,并未将其注册为Spring容器中可供其他bean依赖的DataSourceTransactionManager类型bean,这就导致AuthBeans依赖的DataSourceTransactionManager找不到对应实例。
解决方案
你需要明确将DataSourceTransactionManager注册为Spring容器的bean,同时确保Spring Batch使用该实例,以下两种方式均可解决问题:
方式一:在CustomBatchConfigurer中注册事务管理器bean
修改CustomBatchConfigurer,将事务管理器的创建逻辑改为Spring管理的bean方法,加上@Bean注解,让容器能够识别并提供该实例:
@Configuration public class CustomBatchConfigurer implements BatchConfigurer { @Autowired private DataSource dataSource; // 注册DataSourceTransactionManager为Spring容器bean @Bean public DataSourceTransactionManager dataSourceTransactionManager() { return new DataSourceTransactionManager(dataSource); } @Override public JobRepository getJobRepository() throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(dataSource); factory.setTransactionManager(dataSourceTransactionManager()); factory.afterPropertiesSet(); return (JobRepository) factory.getObject(); } @Override public PlatformTransactionManager getTransactionManager() throws Exception { // 返回已注册的事务管理器实例 return dataSourceTransactionManager(); } @Override public JobLauncher getJobLauncher() throws Exception { SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); jobLauncher.setJobRepository(getJobRepository()); jobLauncher.afterPropertiesSet(); return jobLauncher; } @Override public JobExplorer getJobExplorer() throws Exception { JobExplorerFactoryBean factory = new JobExplorerFactoryBean(); factory.setDataSource(dataSource); factory.afterPropertiesSet(); return (JobExplorer) factory.getObject(); } }
方式二:通过@EnableBatchProcessing指定已有事务管理器
如果你的应用原本就存在可用的DataSourceTransactionManagerbean,可直接在@EnableBatchProcessing注解中指定该bean的名称,让Spring Batch复用已有实例,无需自定义BatchConfigurer:
// 假设原有事务管理器bean的名称为dataSourceTransactionManager @EnableBatchProcessing(transactionManagerRef = "dataSourceTransactionManager") @Configuration public class BatchConfig { // 此处可添加其他Batch相关配置 }
注意调整transactionManagerRef的值为你现有DataSourceTransactionManagerbean的实际名称。
关键说明
BatchConfigurer接口的getTransactionManager()方法仅为Spring Batch内部组件(如JobRepository)提供事务管理器,默认不会将该实例注册到Spring容器,因此其他依赖DataSourceTransactionManager类型的bean无法发现它。- 必须保证Spring容器中存在一个
DataSourceTransactionManager类型的bean,才能让AuthBeans正常完成依赖注入。
内容的提问来源于stack exchange,提问作者Jawad Tariq
相关产品推荐
相关产品推荐

