我正在尝试构建一个Spring Batch作业,用户将目录的路径作为输入。在此目录中是csv文件,此文件的名称始终不同。我使用此Java Config定义ItemReader
:
@Bean
@StepScope
public FlatFileItemReader<MyObject> itemReader(
@Value("file:#{jobParameters['directory']}/*.csv") final Resource resource,
final DefaultLineMapper<MyObject> lineMapper) {
final FlatFileItemReader<MyObject> reader = new FlatFileItemReader<>();
reader.setResource(resource);
reader.setLinesToSkip(1);
reader.setLineMapper(lineMapper);
return reader;
}
当我运行作业时,我收到以下错误:
Caused by: java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): URL [file:C:/path/to/directory/*.csv]
at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:251)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144)
... 26 more
显然,在这个地方不可能使用星号作为占位符。有没有其他方法可以动态获取csv文件的路径?
答案 0 :(得分:0)
如果您确定该目录并且始终只有一个CSV文件,那么您可以为该目录获取create File
对象并从listFiles()
获取第一个项目,然后创建资源对象,如下所示:
public FlatFileItemReader<MyObject> itemReader(
@Value("file:#{jobParameters['directory']}") final String resourceDir,
final DefaultLineMapper<MyObject> lineMapper) {
File[] files=new File(resourceDir).listFiles(); // you can try giving FileNameFilter for .csv
File csvFile=files[0]; // do null check and isempty
// create Resource
Resource resource = new FileSystemResource(csvFile);
final FlatFileItemReader<MyObject> reader = new FlatFileItemReader<>();
reader.setResource(resource);
reader.setLinesToSkip(1);
reader.setLineMapper(lineMapper);
return reader;
}
或者,如果.csv
文件名具有任何静态前缀或后缀,则可以尝试使用现有代码本身。请查看 6.7.2应用程序上下文构造函数资源路径中的通配符 here部分。例如,假设在您的情况下.csv
文件具有模式abc*.csv
:
@Value("file:#{jobParameters['directory']}/abc*.csv")