Mark Thompson
Mark Thompson

Reputation: 31

using a <jee:jndi-lookup string inside an instance of PropertyPlaceholderConfigurer

Environment: Windows server 2003, Spring 3.0, Tomcat 6

How can I reference a JNDI property inside a PropertyPlaceholderConfigurer?

Specifically, I'm using JNDI to look up a java.lang.String that represents a path to a property file needed by my 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>

My "jee:jndi-lookup"s are working AFAIK. My problem seems to be how to reference JNDI resources inside the tag pair

Thanks in advance! Mark

Upvotes: 3

Views: 9856

Answers (4)

emerino
emerino

Reputation: 1120

Not exactly for a single JNDI property, this is using a Properties reference instead, obtained through JNDI:

<!-- 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>

Upvotes: 0

TechTrip
TechTrip

Reputation: 4537

I do this in Spring 3 using a map as follows:

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

This works fine in most cases. You may run into trouble if you use AOP or something that wraps the bean in a Proxy class even if you set eager init correctly. A solution in that case is to directly access the somethingWithMap bean from the app context when needed using:

applicationContext.getBeansOfType(type, includeNonSingletons, allowEagerInit);

*Note that this will return a Map<String, T> where you can access the bean by name.

Upvotes: 0

Aravind A
Aravind A

Reputation: 9697

I believe you will have to do something like this . I haven't tested it but basically the setLocations method in PropertyPlaceholderConfigurer takes in an array of Resource(In our case UrlResource - http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/core/io/UrlResource.html) which in turn has a constructor with the file path .

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

I am not sure if there is a tag called in spring . Check this http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-introduction

Upvotes: 0

Biju Kunjummen
Biju Kunjummen

Reputation: 49935

Your approach may not work Mark, this is because PropertyPlaceHolderConfigurer is a BeanFactoryPostProcessor and gets invoked at the point when the bean definitions are created, whereas the jndi lookup happens post this stage.

I saw an older Spring forum discussion item, which has a recommendation for an approach of using a jndi lookup based properties file, which may suit your needs:

Upvotes: 0

Related Questions