используя - PullRequest
       72

используя

3 голосов
/ 07 декабря 2011

Среда: Windows Server 2003, Spring 3.0, Tomcat 6

Как я могу ссылаться на свойство JNDI внутри PropertyPlaceholderConfigurer?

В частности, я использую JNDI для поиска java.lang.String, которая представляет путь к файлу свойств, необходимому для моего веб-приложенияработают AFAIK.Кажется, моя проблема заключается в том, как ссылаться на ресурсы JNDI внутри пары тегов

Заранее спасибо!Mark

Ответы [ 4 ]

0 голосов
/ 27 сентября 2014

Не совсем для одного свойства JNDI, вместо этого используется ссылка на свойства, полученная через 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>
0 голосов
/ 07 декабря 2011

Я верю, что тебе придется сделать что-то подобное. Я не проверял его, но в основном метод setLocations в PropertyPlaceholderConfigurer принимает массив 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

0 голосов
/ 02 апреля 2012

Я делаю это весной 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, даже если вы правильно настроили eager init. Решением в этом случае является прямой доступ к бинуthingWithMap из контекста приложения, когда это необходимо, с помощью:

applicationContext.getBeansOfType(type, includeNonSingletons, allowEagerInit);

* Обратите внимание, что это вернет Map<String, T>, где вы можете получить доступ к бину по имени.

0 голосов
/ 07 декабря 2011

Ваш подход может не работать, Марк, это потому, что PropertyPlaceHolderConfigurer является BeanFactoryPostProcessor и вызывается в момент создания определений бина, тогда как поиск jndi происходит после этой стадии.

Я видел старый форум Spring Spring , в котором есть рекомендация по подходу к использованию файла свойств, основанного на поиске jndi, который может удовлетворить ваши потребности:

...