当前位置: 首页 > 知识库问答 >
问题:

在数据库中保存数据时引发NullPointerException的Spring批处理

李博达
2023-03-14

我尝试实现Spring Batch。在这里,我试图将数据从文本文件保存到数据库中。我在处理的时候得到了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将文本文件数据保存到自定义writer类中的数据库中。此处StudentRepo为空。

为什么是空的?我尝试了另一种方法,用同样的方法手工存储在数据库中,没有问题。只有在writer类中,它是空的。

共有1个答案

鞠隐水
2023-03-14

FileReadingStep中,不使用通过@component注释创建的Writerbean。您创建了一个新的writer实例,Spring上下文不知道为什么repo字段没有设置,并且保持null

您需要像插入ResourceLoaderJobBuilderFactory一样插入Writerbean,然后在FileReadingStep中使用该bean

 类似资料:
  • 我有一个使用JPA的Spring Boot应用程序,它有一个PostgreSQL数据库。我使用的是Spring Batch。场景是我正在读取一个文件并将数据写入PostgreSQL数据库。当程序在数据库中创建Spring Batch使用的元数据表时,它与PostgreSQL一起工作。但我需要的是Spring Boot不要创建元数据表,并通过Spring Batch使用内存中基于映射的作业存储库。我

  • 我的场景是,批处理作业应该从1db(H2)读取数据,并将数据转储到另一DB(postgres)中。因此,我配置了多个数据源 我已经使用spring batch 4.2和spring boot 2.2.5编写了批处理作业。释放现在我需要为端到端测试编写测试用例。 我使用ResourcelessTransactionManager使用自定义批处理配置器来避免在内存和实际数据库中保存批处理表元数据,并且

  • 我正在使用Spring Batch和JPA处理一个批处理作业并执行更新。我正在使用默认的存储库实现。 并且我正在使用一个repository.save将修改后的对象保存在处理器中。而且,我没有在处理器或编写器中指定任何@Transactional注释。 下面是我的步骤,读取器和写入器配置:另外,我的config类是用EnableBatchProcessing注释的 在writer中,这就是我使用的

  • 我使用Spring批处理从Oracle数据库读取数据并将结果写入CSV文件。 我还需要将spring批处理元数据表与oracle数据库分开,为此,我在批处理配置中配置了两个不同的数据源(spring批处理元数据的内存数据库)。 这是我的代码: 批处理配置。JAVA 然后我的itemReader bean看起来像: 当我运行批处理时,一切正常。 但是当我尝试在我的BatchApplication中添

  • 我有带有Spring、Hibernate/JPA和Spring数据的webapp。我为一些实体创建了扩展JpaRepository的存储库,如果某些字段名简单为id(findById)或findByRole(其中Role是enum或findByActive,其中active是给定实体中的布尔字段),那么使用缺省方法如.save(T)或saveAndFlush、findAll甚至findBy都很好。

  • 我使用的是由java.sql引起的相同代码:na]。SQLSyntaxErrorException:ORA-00942:表或视图不存在-Spring批处理,无法将记录保存到数据库中。 我已经创建了表 LifeCycleStatusWriter.java 作家 错误: 配置详细信息 数据库配置