环境:Windows server 2003,Spring 3.0,Tomcat 6
如何在PropertyPlaceholderConfigurer中引用JNDI属性?
具体来说,我正在使用JNDI来查找表示路径的java.lang.String 我的webapp所需的属性文件
<jee:jndi-lookup id="mypropsfile1" jndi-name="myPropsFile1" resource-ref="true"/>
<jee:jndi-lookup id="mypropsfile2" jndi-name="myPropsFile2" resource-ref="true"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<array>
<value>how to use mypropsfile1 here ??</value>
<value>how to use mypropsfile2 here ??</value>
</array>
</property>
</bean>
我的“jee:jndi-lookup”正在使用AFAIK。我的问题似乎是如何引用JNDI资源 在标签对内
提前致谢! 标记
答案 0 :(得分:0)
你的方法可能不起作用Mark,这是因为PropertyPlaceHolderConfigurer是一个BeanFactoryPostProcessor,并在创建bean定义时调用,而jndi查找在此阶段后发生。
我看到了一个older Spring forum讨论项目,其中建议使用基于jndi查找的属性文件,这可能符合您的需求:
答案 1 :(得分:0)
我相信你必须做这样的事情。我还没有对它进行测试,但基本上PropertyPlaceholderConfigurer中的setLocations方法接受了一个Resource数组(在我们的例子中是UrlResource - http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/core/io/UrlResource.html),后者又有一个带有文件路径的构造函数。
<jee:jndi-lookup id="mypropsfile1" jndi-name="myPropsFile1" default-value="file:///C:/defaultPath" resource-ref="true"/>
<jee:jndi-lookup id="mypropsfile2" jndi-name="myPropsFile2" resource-ref="true"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" depends-on="mypropsfile1,mypropsfile2">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<bean class="org.springframework.core.io.UrlResource">
<constructor-arg><ref bean="mypropsfile1"/></constructor-arg>
</bean>
<bean class="org.springframework.core.io.UrlResource">
<constructor-arg><ref bean="myPropsFile2"/></constructor-arg>
</bean>
</list>
</property>
</bean>
我不确定春天是否有一个标签。请检查此http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-introduction
答案 2 :(得分:0)
我在Spring 3中使用如下地图执行此操作:
<jee:jndi-lookup id="myJndiLookup" jndi-name="com.techtrip.spring.config.myJndiLookup"></jee:jndi-lookup>
<bean id="somethingWithMap" class="com.techtrip.foo.SomethingWithMap">
<property name="propMap">
<map>
<entry key="myJndiLookup" value-ref="myJndiLookup" />
</map>
</property>
</bean>
在大多数情况下这很好用。如果使用AOP或在Proxy类中包装bean的东西,即使正确设置了eager init,也可能会遇到麻烦。在这种情况下,解决方案是在需要时使用以下命令从应用程序上下文中直接访问somethingWithMap bean:
applicationContext.getBeansOfType(type, includeNonSingletons, allowEagerInit);
*请注意,这将返回Map<String, T>
,您可以在其中按名称访问bean。
答案 3 :(得分:0)
不完全是针对单个JNDI属性,而是使用通过JNDI获取的Properties引用:
<!-- Lookup Properties reference through JNDI -->
<jee:jndi-lookup id="config-properties" jndi-name="resources/resource-name" resource-ref="true"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" depends-on="config-properties">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<!-- Once the reference is obtained from JNDI, it can be used like any other reference -->
<property name="properties" ref="config-properties"></property>
</bean>