Spring Boot:在PropertySourcesPlaceholderConfigurer加载的文件中忽略了配置文件

时间:2017-12-08 15:56:29

标签: spring spring-boot spring-profiles spring-properties spring-config

我有一个Spring Boot项目库。该库有一个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说使用dev props:

---
spring:
    profiles: 
        active: dev

但是当我检查env的值时,我得到了“prod”。为什么呢?

如何告诉Spring Boot使用library.yml中的活动(例如dev)配置文件道具?

注意:我更喜欢使用.yml而不是.properties文件。

1 个答案:

答案 0 :(得分:2)

默认情况下,PropertySourcesPlaceholderConfigurer对获取特定于配置文件的道具一无所知。如果在env等文件中多次定义了prop,则它将绑定与该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;
}