我正在使用 Spring Boot 和 Spring Batch 应用程序来测试使用以下代码将参数传递给
ItemReader
,但是当我使用 contact-out.dat
时,StepScope
文件(即输出文件)的内容为空注解。没有错误,只是没有产生任何结果:
@Bean
@StepScope
public ItemReader<Contact> reader(@Value("#{jobParameters['fileName']}") String fileName) {
BeanIOFlatFileItemReader<Contact> reader = new BeanIOFlatFileItemReader<>();
try {
reader.setUseSpringExceptions(true);
reader.setResource(new FileSystemResource(fileName));
reader.setStreamName(inputContactStreamName);
reader.setStreamMapping(new ClassPathResource(beanIoConfigurationXmlPath));
reader.setStreamFactory(StreamFactory.newInstance());
reader.getLineNumber();
reader.afterPropertiesSet();
} catch (Exception e) {
log.error("ERROR: An issue occurred in the BeanIO Item Reader:: {} {}", e.getMessage(), e.getStackTrace());
}
return reader;
}
@Bean
public FlatFileItemWriter<Contact> writer() {
FlatFileItemWriter<Contact> writer = new FlatFileItemWriter<>();
writer.setResource(new FileSystemResource(fileOutputContact));
writer.setLineAggregator(new DelimitedLineAggregator<Contact>() {
{
setDelimiter(",");
setFieldExtractor(new BeanWrapperFieldExtractor<Contact>() {
{
setNames(new String[] { "firstName", "lastName", "street", "city", "state", "zip" });
}
});
}
});
return writer;
}
@Bean("InputJob")
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Job importUserJob(Step step) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step)
.end()
.build();
}
@Bean
public Step step(ItemReader<Contact> reader) {
return stepBuilderFactory.get("step")
.<Contact, Contact> chunk(10)
.reader(reader(null))
.processor(contactItemProcessor)
.writer(writer())
.build();
}
现在,如果我删除
StepScope
注释并进行以下更改,则 contact-out.dat
文件具有预期内容:
@Bean
//@StepScope
public ItemReader<Contact> reader(/*@Value("#{jobParameters['fileName']}") String fileName*/) {...}
@Bean
public Step step(ItemReader<Contact> reader) {
return stepBuilderFactory.get("step")
.<Contact, Contact> chunk(10)
.reader(reader(/*null*/))
.processor(contactItemProcessor)
.writer(writer())
.build();
}
使用输出文件始终为空的
StepScope
注释时我在这里做错了什么?