我目前正在使用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?
谢谢。
答案 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的已接受答案。