[英]Activating Spring @Profile Using JNDI
我目前正在使用Spring @Profile
根据环境(DEV,TEST,PROD)管理Web应用程序的配置。 为了激活正确的配置文件,我spring.profiles.active
在web.xml
对spring.profiles.active
的值进行硬编码。 相反,我想依靠服务器上的JNDI来确定要激活的正确配置文件。 通过使用名为DEV的值创建一个JNDI字符串spring.profiles.active
,以激活我的Web应用程序中的DEV概要文件,可以使此工作正常进行。
问题是我的服务器环境已经有一个自定义JNDI(例如bla/environment
),其中包含值DEV,TEST或PROD。
是否可以基于此自定义JNDI设置spring.profiles.active
,这样我就不必创建另一个执行相同操作的JNDI?
谢谢。
您始终可以为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>
没尝试过,但是我想你可以做
<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>
为配置文件JNDI条目( bla/environment
)创建特定于应用程序的别名。 有关详细信息,请查看此问题的公认答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.