如何扩展 Spring 属性中的通配符?
How can I expand wildcards in Spring properties?
我正在开发 spring 引导应用程序,我想像这样注入资源集合:
@Value("${app.users-location}")
Collection<Resource> csvResources;
里面 application.properties
我写了以下内容:
app.users-location=/feed/*.csv
但它没有按预期工作:
对于那种情况,我希望看到 Resource
.
类型的 5 个元素的集合
如何实现?
有效:
@Value("app.users-location")
String foo; // inject "/feed/*.csv"
这也是有效的 (source) :
@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));
}
这里是关于你的问题的讨论:
https://github.com/spring-projects/spring-boot/issues/12993
目前版本似乎不支持
有昵称的人 m.antkowicz
- https://whosebug.com/users/4153426/m-antkowicz
提供了正确答案但随后将其删除。
他的解决方案是使用数组而不是列表:
@Value("${app.users-location}")
Resource[] resources;
@PostConstruct
public void init(){
System.out.println(resources);
}
我检查了一下,确实有效!!!
我正在开发 spring 引导应用程序,我想像这样注入资源集合:
@Value("${app.users-location}")
Collection<Resource> csvResources;
里面 application.properties
我写了以下内容:
app.users-location=/feed/*.csv
但它没有按预期工作:
对于那种情况,我希望看到 Resource
.
如何实现?
有效:
@Value("app.users-location")
String foo; // inject "/feed/*.csv"
这也是有效的 (source) :
@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));
}
这里是关于你的问题的讨论:
https://github.com/spring-projects/spring-boot/issues/12993
目前版本似乎不支持
有昵称的人 m.antkowicz
- https://whosebug.com/users/4153426/m-antkowicz
提供了正确答案但随后将其删除。
他的解决方案是使用数组而不是列表:
@Value("${app.users-location}")
Resource[] resources;
@PostConstruct
public void init(){
System.out.println(resources);
}
我检查了一下,确实有效!!!