使用JNDI激活Spring @Profile

时间:2013-10-07 21:00:30

标签: java spring

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

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

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

谢谢。

3 个答案:

答案 0 :(得分:2)

您始终可以为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>

答案 1 :(得分:0)

没试过,但我想你可以做到

<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>

答案 2 :(得分:0)

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