java - 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手动存储在数据库中,没有问题。只有在作家类它是空的。
解决方案
在fileReadingStep
中,您不使用通过注释Writer
创建的 bean 。@Component
您创建了一个Writer
Spring 上下文不知道的新实例,因此未设置 repo 字段并保持不变null
。
您需要Writer
像注入ResourceLoader
or一样注入 bean JobBuilderFactory
,然后在fileReadingStep
.
推荐阅读
- haskell - 带有 Haskell 的事件驱动器 - 键入和管理对象状态的错误
- html - 在box1/box2/box3中没有插入单词之前,整个布局都很好。如果我在任何 div 中添加一个单词,我的设计就会受到干扰
- performance - 如何使用需要嵌入 100 多个其他微前端的微前端创建自包含服务?
- python - ImportError:无法从“sklearn.model_selection”导入名称“StratifiedGroupKFold”
- ios - 在应用程序文件中找不到 CocoaPods 供应商框架
- python - Python意外返回分数和虚数
- elasticsearch - 如何在 elasticsearch/Kibana 中强制索引文档
- python-3.x - 从 lambda 向 SNS 发布超过 6000 条消息
- flutter - 在退出应用程序之前会弹出 Flutter 显示确认
- typescript - Typescript intellisense 无法根据条件推断条件类型的泛型类型