Spring Boot批处理报错:找不到'dataSource' Bean求助
解决Spring Batch + MongoDB中缺失
dataSource Bean的问题 错误原因
Spring Batch默认依赖JDBC数据源存储作业元数据(如作业执行记录、步骤执行状态等),会自动查找名为dataSource的Bean。但你已经通过spring.autoconfigure.exclude排除了JDBC数据源的自动配置,且未提供替代的元数据存储方案,因此触发该错误。
解决核心思路:配置Spring Batch使用MongoDB存储作业元数据,替代默认的JDBC实现。
具体解决方案
1. 添加Spring Batch MongoDB依赖
首先确保项目引入spring-batch-mongodb依赖,这是Spring Batch支持MongoDB元数据存储的必要组件:
Maven:
<dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-mongodb</artifactId> <version>与你的Spring Boot版本匹配即可</version> </dependency>
Gradle:
implementation 'org.springframework.batch:spring-batch-mongodb'
2. 修改BatchConfig配置类
调整配置,创建基于MongoDB的JobRepository和事务管理器,替换默认的JDBC实现:
@Configuration @EnableBatchProcessing public class BatchConfig { @Autowired private MongoTemplate mongoTemplate; // 配置MongoDB版JobRepository(存储作业元数据) @Bean public JobRepository jobRepository() throws Exception { MongoJobRepositoryFactoryBean factoryBean = new MongoJobRepositoryFactoryBean(); factoryBean.setMongoTemplate(mongoTemplate); factoryBean.setTransactionManager(mongoTransactionManager()); factoryBean.afterPropertiesSet(); return factoryBean.getObject(); } // 配置Mongo事务管理器 @Bean public MongoTransactionManager mongoTransactionManager() { return new MongoTransactionManager(mongoTemplate.getMongoDatabaseFactory()); } // 以下原有Bean保持不变 @Bean public Job jobBean(JobRepository jobRepository, JobCompletionNotificationImpl listener, Step step){ return new JobBuilder("job", jobRepository) .listener(listener) .flow(step) .end() .build(); } @Bean public Step step(JobRepository jobRepository, MongoTransactionManager transactionManager, ItemReader<Product> reader, ItemProcessor<Product,Product> processor, ItemWriter<Product> writer){ return new StepBuilder("jobStep", jobRepository) .<Product,Product>chunk(5, transactionManager) .reader(reader) .processor(processor) .writer(writer) .build(); } @Bean public FlatFileItemReader<Product> reader(){ return new FlatFileItemReaderBuilder<Product>() .name("itemReader") .resource(new ClassPathResource("data.csv")) .linesToSkip(1) .delimited() .names("title", "description", "price", "discount") .targetType(Product.class) .build(); } @Bean public ItemProcessor<Product,Product> itemProcessor(){ return new CustomItemProcessor(); } @Bean public ItemWriter<Product> itemWriter(){ return list -> { for(Product product : list) mongoTemplate.save(product); }; } }
3. 验证Product实体类
确保Product类包含所有需要的字段,且每个字段都有对应的getter/setter方法(否则CSV数据无法正确映射,处理逻辑也会失效):
public class Product { private String title; private String description; private String price; private String discount; private String discountedPrice; // 所有字段的getter和setter public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getDiscount() { return discount; } public void setDiscount(String discount) { this.discount = discount; } public String getDiscountedPrice() { return discountedPrice; } public void setDiscountedPrice(String discountedPrice) { this.discountedPrice = discountedPrice; } }
4. 保留现有application.properties配置
你的配置已经正确排除了JDBC数据源自动配置,无需修改:
spring.application.name=BatchProcessing spring.data.mongodb.uri=mongodb://localhost:27017/batch spring.data.mongodb.auto-index-creation=true server.port=8080 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
内容的提问来源于stack exchange,提问作者Shivam Kumar
相关产品推荐
相关产品推荐

