我可以在@Value注释资源中使用占位符吗?

时间:2015-07-21 07:52:26

标签: java spring spring-batch

我正在尝试构建一个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文件的路径?

1 个答案:

答案 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")