Конфигурация весенней загрузки YAML для комбинаций профилей - PullRequest
0 голосов
/ 04 июня 2019

Из документации по конфигурации начальной загрузки YAML:

Если документ YAML содержит ключ spring.profiles, то значение профилей (список профилей, разделенных запятыми) подается в метод Spring Environment.acceptsProfiles(). Если какой-либо из этих профилей активен, этот документ включается в окончательное объединение ...

Таким образом, клавиша spring.profiles имеет логику ИЛИ. Если вы установите его на test,dev, то конфигурация будет применена, когда в профили Spring входит test или dev.

То, что я хочу, это логика AND. У меня несколько типов машин и регионов, и я хочу включить некоторую конфигурацию для определенной комбинации типа машины и региона, например production,Europe.

Можно ли установить конфигурации на основе комбинации профилей в файле YAML?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Да, можно настроить конфигурации на основе комбинации профилей в YAML.

spring:
  profiles:
    active: "production,Europe"

---

spring:
  profiles: production

one: prd one
two: prd two
three: prd three

---

spring:
  profiles: Europe

one: EU one
four: EU four


даст вам

one: EU one  // <------
two: prd two
three: prd three
four: EU four

но если вы перевернули заказ (активен: "Европа, производство")

вы получите

one: prd one    // <------
two: prd two
three: prd three
four: EU four
0 голосов
/ 04 июня 2019

Я считаю, что это лучше подходит для ApplicationListener или EnvironmentPostProcessor:

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-boot-application.html#howto-customize-the-environment-or-application-context

Например, ваша логика AND может быть:

@Component
public class MyListener {
    @EventListener
    public void handleContextStart(ApplicationPreparedEvent event) {
        ConfigurableEnvironment env = event.getApplicationContext().getEnvironment();

        if (env.acceptsProfiles(Profiles.of("test")) && env.acceptsProfiles(Profiles.of("test"))) {
            // Do the AND configuration here.
        }
    }
}

Кроме того, вы можете создать свой собственный @ConfigurationProperties: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties

и в методе @PostConstruct выполните дальнейшую настройку:

@ConfigurationProperties("myKey")
public class MyProperties implements EnvironmentAware {

    private Environment Environment;
    private MachineType machineType;
    private String region;

    @Override
    public setEnvironment(Environment environment) {
        this.environment = environment;
    }

    enum MachineType {
        MAC_OS,
        WINDOWS,
        LINUX
    }

    @PostConstruct
    void init() {
        if (environment.acceptProfiles(Profiles.of("dev"))) {
            // Do some work setting other properties
            if (machineType == MachineType.WINDOWS) {
                // some other work if it's Windows
            }
        }
    }
}

, затем используйте MyProperties bean во всем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...