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

mg.*_*mg. 5 spring spring-mvc spring-profiles spring-boot spring-boot-test

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

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

/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializer
Run Code Online (Sandbox Code Playgroud)

MyApplicationContextInitializer.java

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

如果此示例由 JUnit 在模拟环境中执行...

*测试.java

...
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
...
Run Code Online (Sandbox Code Playgroud)

... 以下将被记录。

...
... RestControllerTests   : The following profiles are active: myHost
...
Run Code Online (Sandbox Code Playgroud)

但配置文件myHost未激活,默认配置文件将在 JUnit 的上下文中使用!

带有 VM 参数的 Java 应用程序和 JUnit 测试有效......

-Dspring.profiles.active=myHost
Run Code Online (Sandbox Code Playgroud)

我使用 war 打包的 spring-boot-starter-web 应用程序,并以编程方式设置配置文件并在任何环境中使用

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

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

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

Abe*_*ROS 6

我遇到了同样的问题,最终通过实现 ActiveProfilesResolver 接口解决了它。

在你的情况下,你可以这样做:

public class MyActivateProfilesResolver implements ActiveProfilesResolver {

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

然后您需要将测试与解析器链接起来,如下所示:

@ActiveProfiles(resolver = MyActivateProfilesResolver.class)
Run Code Online (Sandbox Code Playgroud)


小智 6

经过大量谷歌搜索后最简单的答案:)

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)