java - 如何从配置类实用地设置 Spring Active Profiles?

标签 java spring maven intellij-idea

在我正在处理的一个项目中,我们有一些旧的依赖项,它们定义了自己的 spring bean,但需要从主应用程序进行初始化。这些 bean 都是使用 spring 配置文件构建的,即生产代码的“默认”和测试代码的“测试”。我们不想使用 spring 配置文件,而是简单地使用 @import 显式连接我们的上下文。

这个想法是封装所有这些旧的依赖项,这样其他组件就不需要关心 spring 配置文件了。因此,从测试的角度来看,应用程序上下文设置可以描述如下:

@ContextConfiguration(classes = {TestContext.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest { 
  //tests
}

TestContext 进一步指向两个类,其中一个类封装了旧的依赖项:
@Configuration
@Import(value = {OldComponents.class, NewComponents.class})
public class TestContext {
  //common spring context
}

为了封装旧组件对配置文件的需求,OldComponents.class 如下所示:
@Configuration
@Import(value = {OldContext1.class, OldContext2.class})
public class OldComponents {

  static {
    System.setProperty("spring.profiles.active", "test");
  }

}

这里的问题是静态块似乎没有及时执行。运行 mvn clean install 时,由于无法加载 ApplicationContext,测试得到 IllegalStateException。我已验证静态块已执行,但此时似乎已加载 OldContext1 和 OldContext2(依赖于配置文件),这意味着为时已晚。

令人沮丧的是,IntelliJ 以这种方式运行测试很好。然而,Maven 没有。有没有办法在保持封装的同时强制这些配置文件?我试过创建一个中间上下文类,但它没有解决问题。

如果我们在测试类上使用 @ActiveProfiles 注释,它运行得很好,但这种方式违背了目的。自然,我们希望在生产中实现相同的目标,这意味着如果我们不能封装对配置文件的需求,则需要在 web.xml 中进行配置。

最佳答案

如果您的配置类继承 AbstractApplicationContext 您可以调用:

getEnvironment().setActiveProfiles("your_profile");

例如:
public class TestContext extends AnnotationConfigWebApplicationContext {

      public TestContext () {
            getEnvironment().setActiveProfiles("test");
            refresh();
      }

}

希望能帮助到你。

关于java - 如何从配置类实用地设置 Spring Active Profiles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271429/

相关文章:

java - 以编程方式从 Maven Central 检索依赖项的最简单的 Ivy 代码

java - Spring MimeMessageHelper : AddressException when adding multiple CC

java - Mapstruct 与 maven-pom 中的其他注释处理器一起

java - Eclipse + Maven + Dynamic Web Project -> Maven 覆盖 Deployment Assembly

java - Struts 2 Action 中的 Android GCM 服务器

java - 在应用程序中实现同步和异步行为的有效方法

java - Spring Data Neo4j 中的 DynamicRelationshipType 或在运行时定义关系类型

java - 如何在 Spring Boot 中发送请求范围 bean 作为响应

java - 将 sql 中的多个列映射到 java 对象

jsf - 如何获取jenkins的内部版本号,svn修订版号...并将其显示在我的JSF页面上?