Spring Vault不同路径同名配置被覆盖,如何区分访问prop1?
解决方案
当然可以实现分别访问不同路径下的prop1,下面是两种可行的方案:
方案一:利用Vault配置的application-name前缀
Spring Cloud Vault支持在导入路径时指定application-name参数,这个参数会自动将该路径下的所有配置项添加到指定前缀下。
修改你的Spring配置文件(bootstrap.yml或application.yml),把Vault导入路径改成这样:
spring: cloud: vault: config: import: - vault://path/stage/config1?application-name=config1 - vault://path/stage/config2?application-name=config2
配置完成后,config1路径下的prop1就会变成config1.prop1,config2路径下的则是config2.prop1。你可以直接用@Value("${config1.prop1}")注入,或者用@ConfigurationProperties(prefix = "config1")绑定到配置类上。
方案二:自定义环境后置处理器(进阶)
如果方案一不满足你的需求,比如需要更灵活的前缀控制,可以自定义EnvironmentPostProcessor来手动给不同路径的配置添加前缀。
- 实现
EnvironmentPostProcessor接口:
public class VaultPrefixEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { MutablePropertySources propertySources = environment.getPropertySources(); // 处理config1路径的配置,添加config1前缀 propertySources.stream() .filter(ps -> ps.getName().contains("VaultPropertySource") && ps.getName().contains("path/stage/config1")) .forEach(ps -> { Map<String, Object> source = ((MapPropertySource) ps).getSource(); Map<String, Object> prefixedSource = new HashMap<>(); source.forEach((key, value) -> prefixedSource.put("config1." + key, value)); propertySources.replace(ps.getName(), new MapPropertySource(ps.getName() + "-prefixed", prefixedSource)); }); // 处理config2路径的配置,添加config2前缀 propertySources.stream() .filter(ps -> ps.getName().contains("VaultPropertySource") && ps.getName().contains("path/stage/config2")) .forEach(ps -> { Map<String, Object> source = ((MapPropertySource) ps).getSource(); Map<String, Object> prefixedSource = new HashMap<>(); source.forEach((key, value) -> prefixedSource.put("config2." + key, value)); propertySources.replace(ps.getName(), new MapPropertySource(ps.getName() + "-prefixed", prefixedSource)); }); } }
- 在
src/main/resources/META-INF/spring.factories中注册这个处理器:
org.springframework.boot.env.EnvironmentPostProcessor=com.your.package.VaultPrefixEnvironmentPostProcessor
验证
配置完成后,访问actuator/env端点,就能看到config1.prop1和config2.prop1两个独立的配置项,不会再出现覆盖问题,直接通过对应的前缀键访问即可。
内容的提问来源于stack exchange,提问作者Arunkumar KP
相关产品推荐
相关产品推荐

