Spring Jndi Context и PropertyPlaceholderConfigurer - PullRequest
6 голосов
/ 25 января 2012

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

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

Чтобы определить данные .... внутри web.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”);

Но я хочу взять данные в моем common.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 ]

7 голосов
/ 25 января 2012

Вы можете создать свой собственный 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>
1 голос
/ 15 апреля 2014

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

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

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

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

Добавить пространство имен jee к корневому элементу:

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, Spring сделает это за вас):

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

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

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

Боб получит "hello" в качестве аргумента конструктора.

РЕДАКТИРОВАТЬ:

Если вы запускаете свой контекст 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>
1 голос
/ 25 апреля 2012

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

my.properties имеет

default_mask=9999  

пытается прочитать

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

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

0 голосов
/ 27 января 2012
<bean id="propertyConfigurer" 
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
<property name="location">  
<value>classpath:resources/my-jndi.properties</value>       
</property>  
</bean>

В my-jndi.properties: jndi-qconnfactory = jms / QConnFactory

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