移动文件后,FlatFileItemReader的资源未找到

问题描述 投票:1回答:3

我正在使用Spring Batch从CSV文件中读取并在屏幕上写入行。我的工作由3部分组成:第1部分:验证我的磁盘上某个INPUT目录中是否存在CSV文件,如果返回TRUE,文件将被移动到另一个名为PROD的目录。第2部分:使用FlatFileItemReader从CSV文件中提取数据。第3部分:将所有项目写入屏幕。

问题是FlatFileItemReader抛出由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文件作为资源!有没有办法推迟资源分配并避免此异常?

java csv spring-batch flatfilereader
3个回答
0
投票

你可以使用reader.setStrict(false);,如果你将严格模式设置为false,读者不会抛出异常。你可能不得不使用@StepScope让读者懒惰。我使用相同的设置,它对我来说很好,希望这可以帮助你


0
投票

验证我的磁盘上的某个INPUT目录中是否存在CSV文件,如果它返回TRUE,则该文件将被移动到另一个名为PROD的目录中

使用qazxsw poi可以很容易地解决这个问题

JobExecutionDecider

当然,必须更改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()的简单示例)


0
投票

我认为你的here中存在这个问题,因为这种异常是由资源实例的非null断言抛出的。所以你resourceLoader返回null值。

尝试使用resourceLoader,没有任何资源加载器。例如:

FileSystemResource
© www.soinside.com 2019 - 2024. All rights reserved.