【发布时间】: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