繁体   English   中英

使用JNDI激活Spring @Profile

[英]Activating Spring @Profile Using JNDI

我目前正在使用Spring @Profile根据环境(DEV,TEST,PROD)管理Web应用程序的配置。 为了激活正确的配置文件,我spring.profiles.activeweb.xmlspring.profiles.active的值进行硬编码。 相反,我想依靠服务器上的JNDI来确定要激活的正确配置文件。 通过使用名为DEV的值创建一个JNDI字符串spring.profiles.active ,以激活我的Web应用程序中的DEV概要文件,可以使此工作正常进行。

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

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

谢谢。

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

如果那不可行,您可以始终实现自定义ApplicationContextInitializer (从Spring 3.1开始可用)。 然后,这将读取自定义jndi条目并设置活动环境。

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中添加一个条目以将其激活(或者如果要在其中使用它,则将其作为init-param添加到DispatcherServlet )。

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

没尝试过,但是我想你可以做

<bean id="currentProfileName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/bla/environment"/>
</bean>

然后将其作为春季活动资料

<bean
   class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
   <property name="targetClass" value="java.lang.System" />
   <property name="targetMethod" value="setProperty" />
   <property name="arguments">
    <list>
        <value>spring.profiles.active</value>
        <ref bean="currentProfileName" />
    </list>
   </property>
</bean>

为配置文件JNDI条目( bla/environment )创建特定于应用程序的别名。 有关详细信息,请查看此问题的公认答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM