【问题标题】:Activating Spring @Profile Using JNDI使用 JNDI 激活 Spring @Profile
【发布时间】:2013-10-14 14:35:06
【问题描述】:

我目前正在使用 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?

谢谢。

【问题讨论】:

    标签: java spring


    【解决方案1】:

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

    如果这不可行,您始终可以实现自定义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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • jndi-name 属性服务器特定的配置吗?我无法让它工作,我在 web.xml 2.5 规范中看不到这个属性。
      • 是的,您将 res-ref-name 属性映射到特定于服务器的配置中容器管理的 JNDI 名称。您使用的是哪个应用服务器?
      【解决方案3】:

      没试过,但我想你可以做

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

      【讨论】:

        猜你喜欢
        • 2021-12-23
        • 2021-10-15
        • 2011-04-02
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 2014-02-09
        • 2016-11-10
        • 2020-05-09
        相关资源
        最近更新 更多