我想返回Spring应用程序中使用的所有属性的Map。我在SO中发现了几个与此类似的问题但与特定属性文件有关,而我想获得所有属性。
属性应仅适用于当前应用程序 - 不适用于运行时的任何其他部分。
答案 0 :(得分:0)
我提出了以下解决方案。
请注意,这里的技巧是要包含或排除的内容。我可以根据属性文件路径的一些常见部分选择包含,但在这种情况下,我选择排除eclipse,gradle和jre属性。
我最初排除了项目,但在部署到Tomcat时发现我不得不开始排除更多项目。相反,我根据项目名称更改为包含(始终包含公司名称)。代码已更改以反映此情况。
这也有一小部分Java lambda代码(双用户),但必要时可以很容易地重写。
public Map<String, Object> getProperties() throws IOException {
if (props != null) {
return props;
}
props = new HashMap<>();
List<String> includeResourcesSubstringList = Arrays.asList(new String[] { "the_company" });
PropertiesFactoryBean propsFactory = new PropertiesFactoryBean();
PathMatchingResourcePatternResolver resResolver = new PathMatchingResourcePatternResolver(
this.getClass().getClassLoader());
Resource[] resources = resResolver.getResources("classpath*:/**/*");
List<Resource> filteredResources = new ArrayList<>();
logger.debug("Exclude resources containing: " + includeResourcesSubstringList);
for (Resource res : resources) {
if (res.getFilename().endsWith(".properties")) {
logger.debug("Res item to inspect: " + res.getDescription());
boolean includeItem = false;
for (String include : includeResourcesSubstringList) {
if (res.getURI() != null && res.getURI().toASCIIString().contains(include)) {
includeItem = true;
break;
}
}
if (includeItem) {
logger.debug("getProperties() - Included resource: " + res.getDescription());
filteredResources.add(res);
}
}
}
propsFactory.setLocations(filteredResources.toArray(new Resource[0]));
propsFactory.afterPropertiesSet();
Properties properties = propsFactory.getObject();
properties.forEach((key, value) -> {
props.put((String) key, value);
});
return props;
}