【问题标题】:Spring Batch throwing NullPointerException while saving data in database [duplicate]Spring Batch 在数据库中保存数据时抛出 NullPointerException [重复]
【发布时间】:2021-12-25 07:54:39
【问题描述】:

我尝试实现 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 为空。

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

【问题讨论】:

  • 你的spring配置好像有问题。需要更多细节。
  • 我创建了一个控制器并使用相同的存储库保存了数据,没有收到任何错误。仅在 ItemWriter 内部获得 NPE。我调试了我在 repo 中得到了 null。
  • 你如何获得Writer 的实例,其中Writer.writer() 被调用?

标签: java spring spring-boot spring-data-jpa spring-batch


【解决方案1】:

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

您需要像注入 ResourceLoaderJobBuilderFactory 一样注入 Writer bean,然后在 fileReadingStep 中使用 bean。

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多