gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:45:19 25 4
gpt4 key购买 nike

在我正在处理的一个项目中,我们有一些旧的依赖项,它们定义了自己的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com