我正在使用Spring Batch从CSV文件中读取并在屏幕上写下这些行。 我的工作由3部分组成: 第1部分:验证我的磁盘上的某个INPUT目录中是否存在CSV文件,如果它返回TRUE,则文件将被移动到另一个名为PROD的目录。 第2部分:使用FlatFileItemReader从CSV文件中提取数据。 第3部分:将所有项目写入屏幕。
问题是由org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
java.lang.IllegalArgumentException: Input resource must be set
这是我的代码:
@Bean
public FlatFileItemReader<UniversInvestissement> reader() {
FlatFileItemReader<UniversInvestissement> reader = new FlatFileItemReader<>();
File csvFile = new File("C://INPUT/data.csv");
Resource resource = resourceLoader.getResource("file:" + csvFile.getAbsolutePath());
reader.setLinesToSkip(1);
reader.setResource(resource);
DefaultLineMapper lineMapper = new DefaultLineMapper();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[]{"COL1", "COL2", "COL3", "COL4"});
tokenizer.setDelimiter(";");
FieldSetMapper fieldSetMapper = new UniversInvestissementFieldSetMapper();
lineMapper.setLineTokenizer(tokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
reader.setLineMapper(lineMapper);
reader.setEncoding("Cp1252");
return reader;
}
@Bean
public UniversInvestissementWriter writer() {
return new UniversInvestissementWriter();
}
@Bean
public UniversInvestissementProcessor processor() {
return new UniversInvestissementProcessor();
}
@Bean
public Step extractData() {
return steps.get("extractData")
.<UniversInvestissement, UniversInvestissementProcessorResult>chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
实际上问题是,当FlatFileItemReader
初始化时,它无法找到CSV文件作为资源!
有没有办法推迟资源分配并避免这种异常?
答案 0 :(得分:0)
如果您将严格模式设置为false,则可以使用reader.setStrict(false);
,读者将不抛出异常。您可能必须使用@StepScope
来使读者变得懒惰。我使用相同的设置,它对我来说很好,希望这可以帮助你
答案 1 :(得分:0)
验证我的磁盘上的某个INPUT目录中是否存在CSV文件,如果 它返回TRUE,文件将被移动到另一个名为的目录 PROD
使用here
可以轻松解决此问题class Checker implements JobExecutionDecider {
FlowExecutionStatus decide(...) {
if(<file not found in INPUT/ dir>) {
return FlowExecutionStatus.STOPPED;
}
if(!<copy file from INPUT/ to PROD/ works>) {
return FlowExecutionStatus.FAILED;
}
return FlowExecutionStatus.COMPLETED;
}
}
当然,必须更改extractData()
以插入程序化流程决策的使用(检查JobExecutionDecider
以获得一个简单示例)
答案 2 :(得分:0)
我认为你resourceLoader
中的问题,因为资源实例的非空断言引发了这种异常。所以你resourceLoader
返回空值。
尝试使用FileSystemResource
并且不使用任何资源加载器。例如:
reader.setResource(new FileSystemResource(csvFile));