gpt4 book ai didi

java - 使用 JNDI 激活 Spring @Profile

转载 作者:行者123 更新时间:2023-11-30 04:12:43 26 4
gpt4 key购买 nike

我目前正在使用 Spring @Profile 来根据环境(DEV、TEST、PROD)管理我的 Web 应用程序的配置。为了激活正确的配置文件,我不喜欢在 web.xml 中对 spring.profiles.active 的值进行硬编码。相反,我想依靠服务器的 JNDI 来确定要激活的正确配置文件。我可以通过创建一个名为 spring.profiles.active 的 JNDI 字符串来实现此功能,其值为 DEV,以激活我的 Web 应用程序中的 DEV 配置文件。

问题是我的服务器环境已经有一个自定义 JNDI(例如,bla/environment),其中包含值 DEV、TEST 或 PROD。

是否可以根据此自定义 JNDI 设置 spring.profiles.active ,以便我不必创建另一个执行相同操作的 JNDI?

谢谢。

最佳答案

您始终可以为指向 bla/environment 的 JNDI 条目创建特定于应用程序的别名。如何执行此操作取决于您的应用程序服务器。

如果这不可行,您可以随时实现自定义 ApplicationContextInitializer(自 Spring 3.1 起提供)。然后,这将读取自定义 jndi 条目并设置 Activity 环境。

public class EnvironmentApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

private final JndiLocatorDelegate jndi = JndiLocatorDelegate.createDefaultResourceRefLocator();

@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
String profile = jndi.lookup("bla/environment", String.class);
applicationContext.getEnvironment().addActiveProfile(profile);
}
}

类似地,您可以将其包装在 try/catch 中,这样,如果该条目不存在,应用程序也不会失败,而只是依赖于默认机制。

您需要在 web.xml 中添加一个条目来激活它(或者如果您想在 DispatcherServlet 中使用它,则将其作为 init-param 添加到其中)。

<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>your.package.here.EnvironmentApplicationContextInitializer</param-value>
</context-param>

关于java - 使用 JNDI 激活 Spring @Profile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19234686/

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