Контекст 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}"/>