Spring Batch SkipPolicy中JobExecutionContext为null问题求助
问题根因
你当前通过new EmployeeSkipPolicy()手动创建的策略实例没有被Spring容器托管,类上添加的@JobScope、@Value属性注入、@BeforeStep生命周期回调全部不会被Spring触发,因此两个属性默认都是null。
解决方案
- 第一步:给
EmployeeSkipPolicy类添加@Component注解,将其交给Spring容器实例化管理
@Slf4j @Component // 新增注解 @JobScope public class EmployeeSkipPolicy implements SkipPolicy { // 原有代码保持不变 }
- 第二步:在Step配置类中注入Spring托管的
EmployeeSkipPolicy实例,不要手动new
// 配置类中先注入实例 @Autowired private EmployeeSkipPolicy employeeSkipPolicy; // Step构建时替换原有的new逻辑 SimpleStepBuilder simpleStepBuilder = steps.get("employeeJob") .allowStartIfComplete(true) .<Employee, Employee>chunk(10) .reader(employeeFlatFileItemReader) .faultTolerant() .skipPolicy(employeeSkipPolicy) // 注入的Bean,不要new .listener(new EmployeeSkipListener()) .listener(itemProcessListenerSupport()) .processor(employeeProcessor);
补充优化建议
- 如果你只是需要获取作业参数,可以直接通过SpEL注入对应参数值,不需要手动从
ExecutionContext中读取,代码更简洁:
@Value("#{jobParameters['filePath']}") private String filePath; @Value("#{jobParameters['fileName']}") private String fileName;
- 写错误记录到CSV的逻辑建议放到
SkipListener中实现,SkipPolicy只负责判断当前异常是否需要跳过,职责拆分更清晰,也符合Spring Batch的组件设计规范。
内容的提问来源于stack exchange,提问作者integ specialist
相关产品推荐
相关产品推荐

