如何使用spring-batch和MultiResourceItemReader读取文件夹中的所有文件?

我想配置spring-batch以按顺序读取特定文件夹中的所有csv文件。

以下方法不起作用,因为委托将尝试打开名为*.csv的文件,这当然是无效的。 我需要在这里更改什么?

  @Bean public ItemReader reader() { MultiResourceItemReader reader = new MultiResourceItemReader(); reader.setResources(new Resource[] {new FileSystemResource("/myfolder/*.csv")}); reader.setDelegate(new FlatFileItemReader(..)); return reader; } 

等效的xml配置将编写如下,我怎么能将它重写为仅java配置?

     

我认为你应该使用PathMatchingResourcePatternResolver

像这样使用PathMatchingResourcePatternResolver。

 @Bean public ItemReader reader() { Resource[] resources = null; ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); try { resources = patternResolver.getResources("/myfolder/*.csv"); } catch (IOException e) { e.printStackTrace(); } MultiResourceItemReader reader = new MultiResourceItemReader<>(); reader.setResources(resources); reader.setDelegate(new FlatFileItemReader<>(..)); return reader; 

}

绝对文件路径读取多个文件:

  @Bean public MultiResourceItemReader multiResourceItemReader() { MultiResourceItemReader resourceItemReader = new MultiResourceItemReader(); ClassLoader cl = this.getClass().getClassLoader(); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); Resource[] resources = resolver.getResources("file:" + filePath ); resourceItemReader.setResources(resources); resourceItemReader.setDelegate(reader()); return resourceItemReader; } @Bean public FlatFileItemReader reader() { FlatFileItemReader reader = new FlatFileItemReader(); reader.setLineMapper(new DefaultLineMapper() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[]{"id1", "POJO"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ setTargetType(POJO.class); }}); }}); return reader; } 

或者@Value注释可用于让ResourceArrayPropertyEditor将字符串转换为Resource []。

 @Bean @StepScope public ItemReader reader( @Value("file:/myfolder/*.csv") Resource[] resources ) { MultiResourceItemReader reader = new MultiResourceItemReader<>(); reader.setResources(resources); reader.setDelegate(new FlatFileItemReader<>(..)); return reader; }