Контекст Spring Jndi и PropertyPlaceholderConfigurer

используя Spring, я хочу прочитать переменную внутри контекста Webspehere.

чтение переменной среды в Java с помощью Websphere

определение данных.... внутри паутины.в XML

<env-entry>
   <env-entry-name>varName</env-entry-name>
   <env-entry-value>56</env-entry-value>
   <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

чтобы увидеть с java

Context envEntryContext = (Context) new InitialContext().lookup("java:comp/env");
String mydata = (String)envEntryContext.lookup(“varName”);

но я хочу взять данные в моем общем.как в XML

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/WEB-INF/context/servweb.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders">
        <value>true</value>
    </property>
</bean>

может быть, с чем-то вроде этого

 <constructor-arg>
     <jee:jndi-lookup jndi-name="java:comp/env" default-value="data" /> 
  </constructor-arg>

но с контекстом сделать то же самое это

Context envEntryContext = (Context) new InitialContext().lookup("java:comp/env");
String mydata = (String)envEntryContext.lookup(“varName”);

может, что-то вроде этого:

 <constructor-arg>
    <jee:jndi-lookup  jndi-name="java:comp/env">
      <jee:environment>
          varName=default
     </jee:environment>
  </jee:jndi-lookup>

кто-нибудь знает правильный путь?

спасибо заранее

4 ответов


вы можете создать свой собственный PropertyPlaceholderConfigurer

public class JndiPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

    private String jndiPrefix = "java:comp/env/";
    private JndiTemplate jndiTemplate = new JndiTemplate();

    @Override
    protected String resolvePlaceholder(String placeholder, Properties props) {
        String value = null;
        value = resolveJndiPlaceholder(placeholder);
        if (value == null) {
            value = super.resolvePlaceholder(placeholder, props);
        }
        return value;
    }

    private String resolveJndiPlaceholder(String placeholder) {
        try {
            String value = (String)jndiTemplate.lookup(jndiPrefix + placeholder, String.class);
            return value;
        } catch (NamingException e) {
            // ignore
        } 
        return null;
    }

    public void setJndiPrefix(String jndiPrefix) {
        this.jndiPrefix = jndiPrefix;
    }

    public void setJndiTemplate(JndiTemplate jndiTemplate) {
        this.jndiTemplate = jndiTemplate;
    }
}

а затем используйте его в своем applicationContext.xml

<bean id="propertyPlaceholderConfigurer"
      class="mypkg.helper.JndiPropertyPlaceholderConfigurer">
    <property name="properties">
        <props>
            <prop key="varName">default</prop>
        </props>
    </property>
</bean>

или для определения значений по умолчанию в свойствах файла

<bean id="propertyPlaceholderConfigurer"
      class="mypkg.helper.JndiPropertyPlaceholderConfigurer">
    <property name="location" value="classpath:/defaults.properties"/>
</bean>

Я делаю то же самое в своем веб-приложении, но не могу читать из Initialcontext

applicationcontext.xml имеет

<bean 
  class="com.test.webappl.JndiPropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="location" value="file:c:\my.properties"/> 
</bean> 

мой.свойства

default_mask=9999  

пытаюсь читать

Context context = new InitialContext();
String resource = context.lookup("java:comp/env/default_mask");

но привязка контекста имеет только env-запись из интернета.xml, а не из файла свойств


если вы просто хотите получить значение переменной, определенной в контексте контейнера, и использовать ее в качестве строки без создания объекта-заполнителя, вы можете сделать следующее (Это было протестировано в Tomcat, но, скорее всего, работает так же на других серверах container / JEE, таких как WebSphere):

определите переменную среды в Tomcat context.xml (или используйте синтаксис вашего собственного сервера):

<Environment type="java.lang.String" name="myString" value="hello"/>

в файле контекста XML Spring:

добавить Джи пространство имен для корневого элемента :

xmlns:jee="http://www.springframework.org/schema/jee"

и xsi:schemaLocation :

http://www.springframework.org/schema/jee       http://www.springframework.org/schema/jee/spring-jee-3.0.xsd

теперь вы можете легко искать значение (обратите внимание, что вам не нужно указывать java:/comp/env материал, Весна делает это для вас):

<jee:jndi-lookup id="myStringValue"
                     jndi-name="myStringValue"
                     expected-type="java.lang.String" />

тогда вы можете использовать его, например, передать его конструктору bean в качестве ссылки:

<bean id="observationFileManager" class="my.service.Bean">
    <constructor-arg name="myString" ref="myStringValue" />
</bean>

Боб получит "hello" как его construcotr arg.

EDIT:

если вы запустите контекст Spring вне контейнера (Tomcat, Websphere...) для интеграционного тестирования поиск не будет работать. Поэтому, если у вас есть специальный контекст теста, просто добавьте следующее String определение, которое переопределяет jee:lookup и установите значение, которое вы хотите использовать для тестирования :

<!-- This overrides the jndi jee:lookup used in the real context -->
<bean id="mediaFilesBaseDirPath" class="java.lang.String" >
    <constructor-arg value="Z:" />
</bean>

<bean id="propertyConfigurer" 
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
<property name="location">  
<value>classpath:resources/my-jndi.properties</value>       
</property>  
</bean>

в my-jndi.свойства: jndi-qconnfactory=jms / QConnFactory

<jee:jndi-lookup id="connectionFactory" jndi-name="${jndi-qconnfactory}"/>