Spring Batch 5报错:JobBuilderFactory Bean未找到问题及实现方案
错误原因
Spring Boot Batch 5已弃用JobBuilderFactory和StepBuilderFactory,这两个类不再自动注册为Spring Bean,因此依赖注入时会找不到对应的Bean。Batch 5推荐直接使用JobBuilder和StepBuilder结合JobRepository、PlatformTransactionManager来构建Job和Step。
代码修改步骤
1. 调整依赖注入与导入
删除JobBuilderFactory、StepBuilderFactory的导入和私有成员,注入JobRepository和PlatformTransactionManager:
// 移除这两个导入 // import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; // import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; // 新增导入 import org.springframework.batch.core.repository.JobRepository; import org.springframework.transaction.PlatformTransactionManager; @RequiredArgsConstructor @Configuration @EnableBatchProcessing public class JobConfig { // 替换原有的工厂类注入 private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; private final DataSource dataSource; // 其他方法... }
2. 修改Step构建方式
使用StepBuilder替代StepBuilderFactory,传入JobRepository和PlatformTransactionManager:
@Bean public Step step1() { return new StepBuilder("step1", jobRepository) .<BoardDto, BoardDto>chunk(10, transactionManager) .reader(reader()) .writer(writer()) .build(); }
3. 修改Job构建方式
使用JobBuilder替代JobBuilderFactory,传入JobRepository:
@Bean public Job myJob() { return new JobBuilder("myJob", jobRepository) .start(step1()) .build(); }
4. 补充BoardRowMapper实现
需要实现RowMapper<BoardDto>来完成数据库记录到DTO的映射,示例如下:
import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; import java.sql.SQLException; public class BoardRowMapper implements RowMapper<BoardDto> { @Override public BoardDto mapRow(ResultSet rs, int rowNum) throws SQLException { BoardDto dto = new BoardDto(); dto.setId(rs.getLong("id")); dto.setTitle(rs.getString("title")); dto.setContent(rs.getString("content")); dto.setWriter(rs.getString("writer")); return dto; } }
5. 修正写入目标表SQL
你需求是写入另一张表,原代码中写入的是源表board,需要修改为目标表(比如board_copy):
@Bean public JdbcBatchItemWriter<BoardDto> writer() { return new JdbcBatchItemWriterBuilder<BoardDto>() .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()) // 替换为目标表名 .sql("INSERT INTO board_copy (id, title, content, writer) VALUES (:id, :title, :content, :writer)") .dataSource(dataSource) .build(); }
其他必要配置
1. 依赖配置(Maven)
确保pom.xml中包含Spring Boot Batch starter和数据库驱动(以MySQL为例):
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> </dependencies>
2. 数据库配置(application.yml)
在application.yml中配置数据源和Batch相关属性:
spring: datasource: url: jdbc:mysql://localhost:3306/your_database_name username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver batch: jdbc: initialize-schema: always # 初始化Batch元数据表,首次运行后可改为never
验证运行
启动Spring Boot应用,Batch会自动执行myJob,将board表的数据批量写入board_copy表。可以通过日志或数据库查询验证数据是否正确迁移。
内容的提问来源于stack exchange,提问作者jung

