You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Batch 5报错:JobBuilderFactory Bean未找到问题及实现方案

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:22:11