0

我正在开发 Spring Boot 应用程序,我想注入这样的资源集合:

@Value("${app.users-location}")
Collection<Resource> csvResources;

在里面application.properties我写了以下内容:

app.users-location=/feed/*.csv

但它没有按预期工作:

/src/main/resources 包含一个包含 5 个 CSV 的提要文件夹

对于这种情况,我希望看到 5 个类型元素的集合Resource

我怎样才能实现它?

4

3 回答 3

2

这是有效的:

@Value("app.users-location")
String foo; // inject "/feed/*.csv"

这也是有效的(来源):

@Value("classpath*:/feed/*.csv")
Collection<Resource> resources; // inject all resources located in this classpath

但我不知道如何将它们混合在一个注释中:即解析属性并将其与classpath*:前缀一起使用。也许这是可能的...

不管怎样,作为替代,我会注入这个属性app.users-location=/feed/*.csv,我会用它@PostConstruct来获取资源:

import org.springframework.core.io.support.*

@Value("${app.users-location}")
private String usersLocation;
private Collection<Resource> csvResources;

@PostConstruct
public void init(){
    ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();   
    csvResources = 
    Arrays.asList(patternResolver.getResources("classpath*:/" + usersLocation));
}
于 2019-08-06T10:52:35.993 回答
0

以下是关于您的问题的讨论:

https://github.com/spring-projects/spring-boot/issues/12993

当前版本好像不支持

于 2019-08-06T11:15:36.190 回答
0

有 nick 的人m.antkowicz- https://stackoverflow.com/users/4153426/m-antkowicz

提供了正确的答案,但随后将其删除。

https://stackoverflow.com/a/57373605/2674303

他的解决方案是使用数组而不是列表:

@Value("${app.users-location}")
Resource[] resources;

@PostConstruct
public void init(){
    System.out.println(resources);
}

我检查了它,它确实有效!

于 2019-08-07T08:57:13.547 回答