Включение профилей с spring.profiles.include, кажется, отменяет вместо include

Я пытаюсь разделить параметры конфигурации для нескольких приложений загрузки Spring. Я использую Spring Boot 1.1.6, а наши свойства конфигурации выражаются в YAML в обычном стиле application.yml. Я создал различные профили для общих базовых параметров, общих параметров БД и т.д. Я пытался использовать функцию include, упомянутую в Spring Документах загрузки Boot, но, похоже, работает как переопределение, а не include. То есть прямо противоположное тому, что я хочу. Учитывая следующий контент в application.yml, я бы предположил, что свойство name имеет значение bar, когда профиль bar активен, но вместо этого он получает значение foo (из включенного профиля). Я думал, что понятие включения означает, что оно было загружено первым, и любые идентично названные свойства, установленные в новом профиле, будут переопределять те из включенного профиля. Например, если подкласс затеняет поле из суперкласса, любой экземпляр подкласса будет отображать затененное значение. Здесь файл:

spring:
  profiles: foo
name: foo

--- # New YAML doc starts here

spring:
  profiles: 
    include: foo
  profiles: bar
name: bar

Если я запустил это в тестовом примере с явно активированным профилем "bar", свойство имя все равно будет foo:

SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication app = builder.application();
builder.profiles("bar");
ConfigurableApplicationContext ctxt = app.run();
String name = ctxt.getEnvironment().getProperty("name"); // Is always "foo" much to my surprise

Однако, если я прокомментирую, включите:

spring: 
profiles: bar
#  profiles: 
#    include: foo

и активировать два профиля в моем коде:

builder.profiles("foo", "bar");

Затем он работает так, как я ожидал, и для свойства name установлено значение бар. Основная причина, по которой я предпочитаю обрабатывать включенные в файлы YAML, заключается в том, что она оказывает меньшее влияние на мой фактический код, и я могу управлять включением всех профилей в одном месте. С другим подходом мне пришлось бы искать строки профиля и возможные аннотации @Profile во всем моем проекте, если бы я когда-либо переименовал профили. Это определенно больше подвержено ошибкам. Я думаю, что более гибкое решение заключалось бы в явном выражении того, включит ли включенный профиль переопределенные значения подпрофиля или нет. Может быть, что-то вроде:

spring:
  profiles: bar
  profiles:
    include: foo
      override: false

Возможно, я просто что-то пропустил. Есть ли лучший способ сделать это? Благодарю.

Ответ 1

Попробуйте следующее: foo включить, но переопределить бар, похоже, работает для моего решения

spring:
    profiles:
        include: bar
        active: foo,bar

Изменить: пожалуйста, подумайте, что это "взломать", официально не поддерживается, а для версии 2016