如何以编程方式为任何环境设置活动配置文件?

时间:2017-03-07 10:46:02

标签: spring spring-mvc spring-boot spring-profiles spring-boot-test

我想为任何环境设置依赖于活动的配置文件主机,并且找不到与环境无关的挂钩。

以下工厂将在构建应用程序上下文之前设置活动配置文件。

/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的测试和带有VM参数的JUnit工作......

-Dspring.profiles.active=myHost

我使用war-packaged spring-boot-starter-web应用程序,并且应在任何环境中设置和使用编程配置文件

  • Java应用程序
  • JUnit的
  • Servlet容器

如何为任何环境设置配置文件以编程方式

我不想使用VM参数或environemt变量,因为配置文件应由当前主机名设置。

2 个答案:

答案 0 :(得分:0)

我有同样的问题,我终于解决了它实现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)

答案 1 :(得分:0)

经过大量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);`enter code here`
  }
}