Spring Boot Batch报错:创建batchConfigurer Bean失败(缺失DataSource)
嘿,我来帮你搞定这个启动报错的问题!你遇到的核心问题是:Spring Boot的Batch自动配置默认会启用基于JDBC的JdbcBatchConfiguration,这个配置必须依赖DataSource bean,但你的项目只用到MongoDB,完全不需要SQL数据库,所以就出现了找不到DataSource的异常。哪怕你已经排除了DataSourceAutoConfiguration,但Batch的JDBC配置依然在生效,这就是问题根源。
具体解决步骤
1. 精准排除Batch的JDBC自动配置
最直接的方式是在启动类的@SpringBootApplication注解里,除了排除DataSourceAutoConfiguration,再把JdbcBatchConfiguration也排除掉,这样就不会触发需要DataSource的Batch配置了:
修改你的启动类代码:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.batch.JdbcBatchConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, JdbcBatchConfiguration.class }) public class MyBatchApplication { public static void main(String[] args) { SpringApplication.run(MyBatchApplication.class, args); } }
2. 自定义BatchConfigurer(更灵活的方案)
如果你的批处理场景需要更定制化的配置,也可以自己写一个BatchConfigurer,跳过DataSource的设置:
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class MongoBatchConfigurer extends DefaultBatchConfigurer { @Override public void setDataSource(DataSource dataSource) { // 重写这个方法,不设置DataSource,Spring Batch会自动用内存存储来管理作业元数据 } }
这个方式的好处是,Spring Batch会使用基于内存的Map来存储作业的元数据,完全不需要数据库,适合简单的批处理场景。
3. 修复你的MongoItemWriter配置
另外注意一下你的writer()方法,你创建了MongoItemWriter但没有设置mongoTemplate和目标集合,这样运行的时候肯定会报错,记得补上:
@Bean public ItemWriter<BasicDBObject> writer() { MongoItemWriter<BasicDBObject> writer = new MongoItemWriter<>(); writer.setTemplate(mongoTemplate); writer.setCollection("test"); // 这里填你要写入的MongoDB集合名 return writer; }
补充说明:为什么之前排除DataSourceAutoConfiguration没用?
因为JdbcBatchConfiguration的生效条件是存在javax.sql.DataSource这个类(这个类是JDK自带的,不是SQL驱动依赖),所以哪怕你排除了DataSource的自动配置,Batch的JDBC配置依然会尝试创建依赖DataSource的batchConfigurer,这才导致了报错。
内容的提问来源于stack exchange,提问作者rupesh

