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

Spring Batch 6.0.2迁移后用JobOperatorTestUtils写E2E测试遇Bean实例化问题

问题原因

Spring Batch 6.0+版本不再自动注册JobOperator Bean,而JobOperatorTestUtils依赖该Bean才能完成实例化。你的配置中既未启用完整的Spring Batch核心配置,也未手动定义JobOperator Bean,导致容器无法找到符合条件的依赖,从而报错。

解决方案

1. 启用Spring Batch核心配置

在BatchConfig类上添加@EnableBatchProcessing注解,该注解会自动注册JobRegistry、JobExplorer等Batch核心组件:

@Configuration
@EnableBatchProcessing // 新增该注解
public class BatchConfig {
    // 原有代码保持不变
}

2. 添加Job自动注册处理器

新增JobRegistryBeanPostProcessor Bean,自动将你定义的Job注册到JobRegistry中,确保JobOperator能找到目标作业:

@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) {
    JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
    postProcessor.setJobRegistry(jobRegistry);
    return postProcessor;
}

3. 手动定义JobOperator Bean

注入Spring Boot自动配置的JobExplorer、JobLauncher、JobRepository等依赖,创建JobOperator实例:

@Bean
public JobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLauncher, 
                               JobRepository jobRepository, JobRegistry jobRegistry) {
    SimpleJobOperator jobOperator = new SimpleJobOperator();
    jobOperator.setJobExplorer(jobExplorer);
    jobOperator.setJobLauncher(jobLauncher);
    jobOperator.setJobRepository(jobRepository);
    jobOperator.setJobRegistry(jobRegistry);
    return jobOperator;
}
修改后的完整BatchConfig代码
package com.example.demo;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.job.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.JobOperator;
import org.springframework.batch.core.launch.support.SimpleJobOperator;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.Step;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor;
import org.springframework.batch.core.launch.JobRegistry;
import org.springframework.batch.core.launch.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.infrastructure.item.ItemProcessor;
import org.springframework.batch.infrastructure.item.ItemReader;
import org.springframework.batch.infrastructure.item.ItemWriter;
import org.springframework.batch.infrastructure.item.support.ListItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import java.util.Arrays;
import java.util.List;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Bean
    public ItemReader<String> itemReader() {
        List<String> items = Arrays.asList("Item1", "Item2", "Item3");
        return new ListItemReader<>(items);
    }

    @Bean
    public ItemProcessor<String, String> itemProcessor() {
        return String::toUpperCase;
    }

    @Bean
    public ItemWriter<String> itemWriter() {
        return items -> items.forEach(System.out::println);
    }

    @Bean
    public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        return new StepBuilder("step", jobRepository)
                .<String, String>chunk(1)
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .transactionManager(transactionManager)
                .build();
    }

    @Bean
    public Job job(JobRepository jobRepository, Step step) {
        return new JobBuilder("job", jobRepository)
                .start(step)
                .build();
    }

    @Bean
    public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) {
        JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
        postProcessor.setJobRegistry(jobRegistry);
        return postProcessor;
    }

    @Bean
    public JobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLauncher,
                                   JobRepository jobRepository, JobRegistry jobRegistry) {
        SimpleJobOperator jobOperator = new SimpleJobOperator();
        jobOperator.setJobExplorer(jobExplorer);
        jobOperator.setJobLauncher(jobLauncher);
        jobOperator.setJobRepository(jobRepository);
        jobOperator.setJobRegistry(jobRegistry);
        return jobOperator;
    }
}
测试类说明

你的BatchConfigTest代码无需修改,现在Spring容器会正确实例化JobOperator,进而成功注入JobOperatorTestUtils,测试可以正常执行。

内容的提问来源于stack exchange,提问作者Vinod Somu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 12:43:15