用一个

时间:2011-12-06 23:33:32

标签: spring jndi spring-3

环境: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资源 在标签对内

提前致谢! 标记

4 个答案:

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