Java 使用JNDI激活Spring@Profile
我目前正在使用SpringJava 使用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
@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>