Java 使用JNDI激活Spring@Profile

Java 使用JNDI激活Spring@Profile,java,spring,Java,Spring,我目前正在使用Spring@Profile根据环境(开发、测试、产品)管理我的web应用程序的配置。为了激活正确的配置文件,我不希望在web.xml中硬编码spring.profiles.active的值。相反,我希望依靠服务器的JNDI来确定要激活的正确配置文件。我可以通过创建一个名为spring.profiles.active的JNDI字符串来实现这一点,该字符串的值为DEV,用于在我的web应用程序中激活DEV概要文件 问题是我的服务器环境已经有一个自定义JNDI(比如,bla/envir

我目前正在使用Spring
@Profile
根据环境(开发、测试、产品)管理我的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


谢谢。

还没试过,但我想你可以试一下

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

然后将其作为spring活动配置文件

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

spring.profiles.active

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

您始终可以为指向
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);
    }
}

jndi name
property服务器是否特定于配置?我无法使其工作,而且在web.xml 2.5规范中也没有看到此属性。是的,您可以将res ref name属性映射到服务器特定配置中的容器管理JNDI名称。您正在使用哪个应用程序服务器?
<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>your.package.here.EnvironmentApplicationContextInitializer</param-value>
</context-param>