Spring Batch中通过@Configuration类在步骤间传变量遇空指针求助
问题原因
出现NullPointerException的核心原因是:Step2Reader是通过new step2Reader<>()手动创建的实例,不属于Spring容器管理,导致其中@Autowired的HistConfig无法被注入,调用config.getCsvFilePath()时自然会抛出空指针异常。
修改方案(不改变原有传递路径的思路)
以下是具体代码修改:
1. 将Step2Reader改为Spring管理的Bean
给Step2Reader添加@Component注解,让Spring容器接管实例创建和依赖注入:
@Slf4j @Component // 新增注解,纳入Spring容器管理 public class Step2Reader<T> extends FlatFileItemReader<T> { @Autowired private HistConfig config; @BeforeStep public void beforeStepForReader(StepExecution stepExecution) { DefaultLineMapper<History> lineMapper = new DefaultLineMapper<>(); DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer(); lineTokenizer.setNames("id", "date", "category"); lineTokenizer.setDelimiter(","); lineMapper.setLineTokenizer(lineTokenizer); lineMapper.setFieldSetMapper(new BeanWrapperFieldSetMapper<History>() {{ setTargetType(History.class); }}); setLinesToSkip(1); setLineMapper((LineMapper<T>) lineMapper); setResource(new FileSystemResource(config.getCsvFilePath())); } }
2. 修改Step2的Bean定义,注入Step2Reader
不再手动new实例,改为注入Spring管理的Step2Reader:
@Autowired private Step2Reader<History> step2Reader; // 注入Spring容器中的reader实例 @Bean public Step step2() { return stepBuilderFactory.get("step2") .<History, ItemRequestModel>chunk(1) .reader(step2Reader) // 使用注入的实例,替代new操作 .processor(step2Processor) .writer(step2Writer) .listener(new LoggingStepExecutionListener()) .build(); }
3. 规范HistConfig的注解(可选但建议)
@Configuration和@Component无需同时使用,@Configuration本身是@Component的派生注解,这里HistConfig只是用来存储路径的普通配置类,保留@Component即可:
@Component public class HistConfig { private String csvFilePath; public String getCsvFilePath() { return csvFilePath; } public void setCsvFilePath(String csvFilePath) { this.csvFilePath = csvFilePath; } }
补充说明
确保两个步骤在同一个Job中按顺序执行(Step1在前,Step2在后),这样Step1的Writer会先设置文件路径,Step2的Reader在@BeforeStep阶段就能获取到有效的路径值。
内容的提问来源于stack exchange,提问作者chiefpika
相关产品推荐
相关产品推荐

