问题:
我有两个库,其目的是从各自的资源中获取属性,并在启动时将其提供给我的应用程序。当前,两个库都将自己的PropertySourceLocator
作为其BootstrapConfiguration
的一部分。
例如
libraryX负责从SourceX获取属性并配置各自的PropertySourceLocator。
libraryY负责从SourceY获取属性并配置各自的PropertySourceLocator
这些库在我的bootstrap.yaml
上配置。例如
libX.enabled: true
libX.password: ${LIB_X_PASS}
libY.enabled: true
libY.password: ${LIB_Y_PASS}
只要这些库不使用彼此的属性,一切都很好。
不幸的是,在我的情况下,libX应该是$ {LIB_Y_PASS}的来源。
所以bootstrap.yaml
现在看起来像这样:
libX.enabled: true
libX.password: ${LIB_X_PASS}
libY.enabled: true
libY.password: ${libX.values.lib_y_pass}
在此配置应用程序中,由于$ {LIB_X_PASS}和$ {libX.values.lib_y_pass}的解析在调用PropertySourceLocator
之前就不再启动。
潜在的解决方案:
@PropertySource
使用PropertySourceLocator
代替libX
。 @PropertySource
中的属性解析发生时,bootstrap.yaml
提供的值似乎可用。唯一的问题是,它似乎与项目中的其他application*.yaml
/ application*.properties
文件具有相同的优先级。因此,不可能用libX
来覆盖现有属性。
例如
libX.enabled: true
libX.password: ${LIB_X_PASS}
libY.enabled: true
libY.password: ${libX.values.lib_y_pass}
libX.values.lib_y_pass: dummy_password
libY.password
将具有dummy_password
的值,而不是libX
@PropertySource
的任何值。可能的原因是,bootstrap.yaml
作为propertySource出现在创建的属性源libX之前,并且在解析期间spring从具有该属性的第一个propertySource中选择了值。
org.springframework.boot.env.EnvironmentPostProcessor
我们可以在环境后期处理阶段将libX属性源注入为第一个属性源。 例如
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
SpringApplication application) {
....
environment.getPropertySources().addFirst(libxPropertySource);
}
这似乎可以很好地解决问题,并解决了解决方案1中的问题,但是我不知道是否存在尚未发现的隐藏问题。
问题
有没有更好的方法来解决问题?
似乎是:
答:我的情况(当我需要另一个引导程序PropertySourceLocator
中的属性时)与PropertySourceLocator
的设计背道而驰,在这种情况下,像这样的骇客是唯一的方法。
B)我缺少了一些东西,问题可以用更简单的方法解决。