我需要在Java中实现客户端代码以使用Spring Cloud配置服务器。客户端既不是Spring应用程序也不是Web服务。
我们将有一个application.properties文件。我们将有一个特定于应用程序的文件。我们将为它们两个提供特定于环境的文件。我对spring config优先级规则的理解是,从最低到最高的优先级应该是:
application.properties (lowest)
specificApp.properties
application-dev.properties
specificApp-dev.properties (highest)
但是,当我用http://localhost:8888/specifcApp/dev调用服务时,属性源的返回顺序与上面的相反:
0: specificApp-dev.properties
1: application-dev.properties
2: specificApp.properties
3: application.properties
我不确定,但是我相信这样做的目的是返回的顺序指示从低到高的优先级(最后一个获胜)。如果是这样,则表明application.properties优先于其他。那与我期望的相反。
我还没有找到在一个位置完全涵盖所有内容的spring文档。周围散布着令人困惑的信息。但是在this文档中,它说:“ ...特定于配置文件的文件总是[覆盖]非特定文件,无论特定于配置文件的文件是在打包jar的内部还是外部。
实际的优先规则是什么,响应中属性源的顺序指示什么?
问题的第二部分是,如何以ANY顺序遍历configService属性源?
我在下面找到了示例代码。但是,问题在于CompositePropertySource.getPropertySources()返回一个Collection。换句话说,无法从CompositePropertySource获取有序列表。 (源在内部存储在Set中的CompositePropertySource中。)
final CompositePropertySource compositePropertySource
= (CompositePropertySource)environment.getPropertySources().get("configService");
if (compositePropertySource != null && compositePropertySource.getPropertySources() != null) {
// compositePropertySource.getPropertySources() is not ordered!
for (final Object mapPropertySourceObject : compositePropertySource.getPropertySources()) {
final MapPropertySource propertySource = (MapPropertySource)mapPropertySourceObject;
if (propertySource != null) {
p.putAll(propertySource.getSource());
LOG.info("fetched remote properties");
}
}
}
总结:
我正在使用Spring Boot 1.5.14.RELEASE和Spring Cloud Edgware.SR4。
编辑:我现在看到CompositePropertySource propertySources集合的类型是 LinkedHashSet,因此它确实有命令。对于CompositePropertySource.getPropertyNames(),很明显,列表后面的属性源中的属性将覆盖列表前面的属性。如果是这样,则application.properties优先于特定于应用程序或配置文件的配置。我看不出这是预期的行为。实际上,这意味着任何属性都不能被覆盖。
编辑#2 :我正在使用Git存储库对此进行测试。所有这四个文件都位于存储库中的同一文件夹中。
编辑#3 :我意识到某些属性会对此产生影响。提交此文件时,我应该说过我正在使用JVM选项启动客户端:-Dspring.profiles.active = dev -Dspring.profiles.default = dev和-Dspring.cloud.config.profile = dev。我也只用-Dspring.cloud.config.profile = dev进行了尝试。
更新:我离解决方案更近了。
我尝试了以下操作:
在这种情况下,它们是按以下顺序退回的:
specificApp-default.properties
application-default.properties
specificApp-dev.properties
application-dev.properties
这仍然不是我期望的。这意味着共享的应用程序属性将覆盖(即优先于)appSpecific属性。我希望可以遵循以下顺序,但是我认为解决方案越来越接近:
application-default.properties
specificApp-default.properties
application-dev.properties
specificApp-dev.properties
甚至这个命令:
application-default.properties
application-dev.properties
specificApp-default.properties
specificApp-dev.properties