Как программно установить активный профиль для любой среды?

Я хочу установить зависимость хоста активного профиля от любой среды и не могу найти независимую от среды ловушку.

Следующая фабрика установит активный профиль до построения контекста приложения.

/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializer

MyApplicationContextInitializer.java

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext ca) {
        ConfigurableEnvironment environment = ca.getEnvironment();
        environment.addActiveProfile("myHost");
    }
}

Если этот пример выполняется в фиктивной среде JUnit ...

* Test.java

...
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
...

... следующие будут регистрироваться.

...
... RestControllerTests   : The following profiles are active: myHost
...

но профиль myHost не активен, и профиль по умолчанию будет использоваться в контексте JUnit!

Тест как Java Application и JUnit с аргументами VM работает ...

-Dspring.profiles.active=myHost

Я использую пакетное приложение spring-boot-starter-web, и программный профиль должен быть установлен и использован в любой среде.

  • Java-приложение
  • JUnit
  • Контейнер сервлета

Как мне настроить профиль программно для любой среды?

Я не хочу использовать аргументы виртуальной машины или переменные environemt, потому что профиль должен быть установлен по текущему имени хоста.


person mg.    schedule 07.03.2017    source источник


Ответы (2)


Самый простой ответ после долгих поисков в Google :)

@SpringBootApplication
public class ExampleMain2 {

  public static void main(String[] args) {
      ConfigurableEnvironment environment = new StandardEnvironment();
      environment.setActiveProfiles("dev");

      SpringApplication sa = new SpringApplication(ExampleMain2.class);
      sa.setEnvironment(environment);
      sa.setAdditionalProfiles("remote","live");
      sa.run(args);
  }
}
person varun myadam    schedule 25.10.2019

У меня была такая же проблема, и я, наконец, решил ее, реализовав интерфейс ActiveProfilesResolver.

В вашем случае вы можете сделать что-то вроде этого:

public class MyActivateProfilesResolver implements ActiveProfilesResolver {

    @Override
    public String[] resolve(Class<?> testClass) {
         // some code to find out your active profiles
         return new String[] {"myHost"};
    }
}

И затем вам нужно связать свой тест с вашим резолвером следующим образом:

@ActiveProfiles(resolver = MyActivateProfilesResolver.class)
person Abel ANEIROS    schedule 10.08.2017