Spring 引导:在 PropertySourcesPlaceholderConfigurer 加载的文件中忽略配置文件
Spring Boot: Profiles ignored in PropertySourcesPlaceholderConfigurer loaded file
我有一个 Spring 引导项目库。该库有一个 library.yml 文件,其中包含用于其配置的 dev 和 prod 属性:
library.yml
---
spring:
profiles:
active: dev
---
spring:
profiles: dev
env: dev
---
spring:
profiles: prod
env: prod
另一个应用程序使用此库并使用以下方式加载道具:
@Bean
public static PropertySourcesPlaceholderConfigurer dataProperties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("library.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}
它的 application.yml 说要使用开发道具:
---
spring:
profiles:
active: dev
但是当我检查 env 的值时,我得到 "prod"。为什么?
如何告诉 Spring Boot 使用 library.yml 中的活动(例如 dev)配置文件道具?
注意:我更喜欢使用 .yml 而不是 .properties 文件。
默认情况下,PropertySourcesPlaceholderConfigurer
对只获取配置文件特定的道具一无所知。如果您在一个文件中多次定义了一个 prop,例如 env
,它将绑定与该 prop 最后一次出现相关联的值(在本例中为 prod
)。
要使其绑定匹配特定配置文件的道具,请设置配置文件文档匹配器。配置文件文档匹配器需要知道可以从环境中获取的活动配置文件。这是代码:
@Bean
public static PropertySourcesPlaceholderConfigurer dataProperties(Environment environment) {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
SpringProfileDocumentMatcher matcher = new SpringProfileDocumentMatcher();
matcher.addActiveProfiles(environment.getActiveProfiles());
yaml.setDocumentMatchers(matcher);
yaml.setResources(new ClassPathResource("library.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}
我有一个 Spring 引导项目库。该库有一个 library.yml 文件,其中包含用于其配置的 dev 和 prod 属性:
library.yml
---
spring:
profiles:
active: dev
---
spring:
profiles: dev
env: dev
---
spring:
profiles: prod
env: prod
另一个应用程序使用此库并使用以下方式加载道具:
@Bean
public static PropertySourcesPlaceholderConfigurer dataProperties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("library.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}
它的 application.yml 说要使用开发道具:
---
spring:
profiles:
active: dev
但是当我检查 env 的值时,我得到 "prod"。为什么?
如何告诉 Spring Boot 使用 library.yml 中的活动(例如 dev)配置文件道具?
注意:我更喜欢使用 .yml 而不是 .properties 文件。
默认情况下,PropertySourcesPlaceholderConfigurer
对只获取配置文件特定的道具一无所知。如果您在一个文件中多次定义了一个 prop,例如 env
,它将绑定与该 prop 最后一次出现相关联的值(在本例中为 prod
)。
要使其绑定匹配特定配置文件的道具,请设置配置文件文档匹配器。配置文件文档匹配器需要知道可以从环境中获取的活动配置文件。这是代码:
@Bean
public static PropertySourcesPlaceholderConfigurer dataProperties(Environment environment) {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
SpringProfileDocumentMatcher matcher = new SpringProfileDocumentMatcher();
matcher.addActiveProfiles(environment.getActiveProfiles());
yaml.setDocumentMatchers(matcher);
yaml.setResources(new ClassPathResource("library.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}