2012-01-25 21 views
6

Usando Spring, quiero leer una variable dentro del contexto de Webspehere.Spring Jndi Context y PropertyPlaceholderConfigurer

Read a Environment Variable in Java with Websphere

para definir los datos .... dentro 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> 

Para ver con Java

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

Pero quiero tomar los datos en mi common.xml como

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

quizás con algo así

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

pero con un contexto para hacer lo mismo que

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

tal vez algo como lo siguiente:

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

alguien sabe la forma correcta?

Gracias de antemano

Respuesta

7

puede crear su propia 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; 
    } 
} 

y luego utilizarlo en su applicationContext.xml

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

o para definir los valores por defecto en un archivo de propiedades

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

Works, sin problemas .. muchas gracias – Kaltresian

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

En my-jndi.properties: jndi-qconnfactory = JMS/QConnFactory

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

que estoy haciendo lo mismo en mi aplicación web, pero no puede leer desde InitialContext

Application Context. XML ha

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

default_mask=9999 

tratando de leer

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

pero la unión sólo tiene env-entry del contexto de la web.xml, no del archivo de propiedades

1

Si solo desea obtener el valor de una variable que se definió en el contexto contenedor y usarlo como una cadena sin crear un objeto marcador de posición, puede hacer lo siguiente (esto fue probado en Tomcat pero lo más probable funciona de la misma en otros servidores de contenedor/JEE como WebSphere):

Definir la variable de entorno de Tomcat de context.xml (o usar la sintaxis de su propio servidor):

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

en el XML de Spring archivo de contexto:

Añadir el espacio de nombres Jee al elemento raíz:

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

y en el del xsi:schemaLocation:

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

Ahora usted puede fácilmente buscar un valor (tenga en cuenta que usted no tiene que especificar el java:/comp/env cosas, la primavera hace por usted):

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

entonces usted puede utilizar, por ejemplo pasarlo al constructor de un grano como referencia cia:

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

El grano recibirá "hello" como su arg construcotr.

EDIT:

Si ejecuta su contexto primavera fuera del contenedor (Tomcat, Websphere ...) para las pruebas de integración, la búsqueda no funcionará. Así que si usted tiene un contexto de prueba especial, sólo tiene que añadir la siguiente definición String que anula el jee:lookup y establecer el valor que desea utilizar para la prueba:

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