首页 > 解决方案 > Spring Batch 在数据库中保存数据时抛出 NullPointerException

问题描述

我尝试实现 Spring 批处理。在这里,我试图将文本文件中的数据保存到数据库中。我在处理时遇到了 NPE。

@Configuration
public class JobConfig {

@Value("${inputFile}") 
private Resource resource;

@Autowired
private ResourceLoader resourceLoader;

private JobBuilderFactory jobBuilderFactory;
private StepBuilderFactory stepBuilderFactory;

@Autowired
public JobConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
    this.jobBuilderFactory = jobBuilderFactory;
    this.stepBuilderFactory = stepBuilderFactory;
}

@Bean
public Job job() {
    return this.jobBuilderFactory.get("JOB-Load")
            .start(fileReadingStep())
            .build();
}

@Bean
public Step fileReadingStep() {
    return stepBuilderFactory.get("File-Read-Step1")
            .<Student,Student>chunk(5)
            .reader(itemReader())
            .processor(new Processer())
            .writer(new Writer())
            .build();
}

@Bean
public FlatFileItemReader<Student> itemReader() {
    FlatFileItemReader<Student> flatFileItemReader = new FlatFileItemReader<>();
    flatFileItemReader.setResource(resource);
    flatFileItemReader.setName("File-Reader");
    flatFileItemReader.setStrict(false);
    flatFileItemReader.setLineMapper(LineMapper());
    return flatFileItemReader;
}

@Bean
public LineMapper<Student> LineMapper() {
    DefaultLineMapper<Student> defaultLineMapper = new DefaultLineMapper<Student>();
    FixedLengthTokenizer fixedLengthTokenizer = new FixedLengthTokenizer();
    fixedLengthTokenizer.setNames(new String[] { "name"});
    fixedLengthTokenizer.setColumns(new Range[] { new Range(1, 5)});
    fixedLengthTokenizer.setStrict(false);

    defaultLineMapper.setLineTokenizer(fixedLengthTokenizer);
    defaultLineMapper.setFieldSetMapper(new DefaultFieldSetMapper());

    return defaultLineMapper;
}

}

作家班

@Component
public class Writer implements ItemWriter<Student> {

@Autowired
private StudentRepo repo;

@Override
public void write(List<? extends Student> items) throws Exception {
    for(Student s:items) {
        System.out.println(s.getName());
    }
    try {
    repo.saveAll(items);
    }catch (Exception e) {
        e.printStackTrace();
    }
}
}

在这里,我使用 JPARepository 将我的文本文件数据保存到我的自定义编写器类中的数据库中。这里StudentRepo为空。

为什么它是空的?我尝试了另一种方法,使用相同的 StudentRepo手动存储在数据库中,没有问题。只有在作家类它是空的。

标签: javaspringspring-bootspring-data-jpaspring-batch

解决方案


fileReadingStep中,您不使用通过注释Writer创建的 bean 。@Component您创建了一个WriterSpring 上下文不知道的新实例,因此未设置 repo 字段并保持不变null

您需要Writer像注入ResourceLoaderor一样注入 bean JobBuilderFactory,然后在fileReadingStep.


推荐阅读