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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:27:55