Spring Batch保存数据到数据库时抛出NullPointerException问题
问题根本原因
你在JobConfig的fileReadingStep方法中直接通过new Writer()手动实例化了Writer类,没有使用Spring容器托管的Bean实例。只有Spring容器创建、管理的Bean对象才会自动处理@Autowired注解的依赖注入,手动new出的对象不受Spring生命周期管控,内部标注了@Autowired的StudentRepo属性不会被自动赋值,因此为null,触发空指针异常。
解决方案
步骤1:注入Spring托管的Writer实例到JobConfig中
优先使用构造注入的方式引入已经标注@Component的Writer Bean,修改JobConfig的代码如下:
@Configuration public class JobConfig { @Value("${inputFile}") private Resource resource; @Autowired private ResourceLoader resourceLoader; private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; // 新增注入Writer private final Writer writer; // 构造方法新增Writer参数 @Autowired public JobConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, Writer writer) { this.jobBuilderFactory = jobBuilderFactory; this.stepBuilderFactory = stepBuilderFactory; this.writer = writer; } // 其余代码不变... @Bean public Step fileReadingStep() { return stepBuilderFactory.get("File-Read-Step1") .<Student,Student>chunk(5) .reader(itemReader()) .processor(new Processer()) // 注意:这里如果Processer类也有@Autowired依赖,同样需要改成注入Bean,不要new .writer(writer) // 替换原来的new Writer() .build(); } }
可选补充
如果你的自定义Processer类中也存在@Autowired注入的属性,需要按照和Writer相同的逻辑调整:先把Processer标注为@Component,再注入到JobConfig中替换new Processer()的写法,避免同样出现空指针问题。
内容的提问来源于stack exchange,提问作者Codinghubby
相关产品推荐
相关产品推荐

