Spring Batch 5 Job测试报错:未注册'step'作用域问题求助
报错信息
ERROR o.s.b.c..AbstractStep [main] 在作业的someStep步骤中关闭步骤执行资源时发生异常
java.lang.IllegalStateException: 未注册名为'step'的作用域
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java.java) ~{spring-beans-6.0.4.jar:6.0.4]
at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java) ~{spring-aop-6.0.4.jar:6.0.4]
at org.springframework.batch.item.file.FlatFileItemReader$$SpringCGLIB$$0.open() ~[spring-batch-infrastructure-5.0.0.jar:5.0.0]
问题原因
核心原因是Spring容器未注册step作用域,而代码中使用了@StepScope定义Reader/Writer组件。此外代码存在几处细节错误,共同触发了该异常。
解决步骤
1. 启用Spring Batch核心配置
主配置类必须添加@EnableBatchProcessing注解,该注解会自动注册step和job作用域,是Spring Batch的核心配置入口:
@Configuration @EnableBatchProcessing public class Config { // 导入其他配置类,确保所有Batch组件被容器加载 @Import({StepConfigClass.class, ReaderWriter.class}) }
2. 修正ReaderWriter类的注解问题
- 移除配置类上的
@StepScope,该注解只需标注在具体Bean方法上 - 修正
@value为大写的@Value(Spring注解大小写敏感)
@Configuration public class ReaderWriter { @Value("#{jobParameters['filename']}") private String fileName; @StepScope @Bean public FlatFileItemReader<obj1> reader() { FlatFileItemReader<obj1> reader = new FlatFileItemReader<>(); // 补充你的读取配置逻辑 return reader; } @StepScope @Bean public FlatFileItemWriter<obj2> writer() { FlatFileItemWriter<obj2> writer = new FlatFileItemWriter<>(); writer.setFooterCallback(t -> t.write(fileName)); // 补充你的写入配置逻辑 return writer; } }
3. 修正测试类的方法调用错误
toJobParameters()是方法,需补充括号完成调用:
@SpringBatchTest @SpringJUnitConfig(Config.class) public class TestClass { @Autowired private JobLauncherTestUtils jobUtils; @Test public void testMethod() throws Exception { JobParameters jobParameters = new JobParametersBuilder() .addString("filename", "testname") .toJobParameters(); // 补充括号 JobExecution jobExecution = jobUtils.launchJob(jobParameters); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); } }
4. 确保StepConfigClass被容器管理
给StepConfigClass添加@Configuration注解,使其被Spring容器扫描并加载:
@Configuration public class StepConfigClass { @Autowired private JobRepository jobRepository; @Autowired private PlatformTransactionManager transactionManager; @Autowired private ItemProcessor<obj, obj1> processor; @Bean public Step step(@Qualifier("writer") FlatFileItemWriter writer, @Qualifier("reader") FlatFileItemReader reader) { return new StepBuilder("testStep", jobRepository) .<obj, obj1>chunk(100, transactionManager) .reader(reader) .processor(processor) .writer(writer) .build(); } }
内容的提问来源于stack exchange,提问作者CODI

