Spring Boot: профили игнорируются в загруженном файле PropertySourcesPlaceholderConfigurer

У меня есть библиотека, которая является проектом 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:

---
spring:
    profiles: 
        active: dev

Но когда я проверяю значение env, я получаю "prod". Зачем?

Как я могу сказать Spring Boot использовать реквизиты активного (например, dev) профиля в library.yml?

Примечание. Я предпочитаю использовать файлы.yml вместо файлов.properties.

1 ответ

Решение

По умолчанию PropertySourcesPlaceholderConfigurer ничего не знает только о получении реквизита конкретного профиля. Если у вас есть опора, определенная несколько раз в файле, например env, он будет связывать значение, связанное с последним вхождением этого реквизита (в этом случае 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;
}
Другие вопросы по тегам