2012-01-25 18 views
6

Utilizzando Spring, voglio leggere una variabile all'interno del contesto di Webspehere.Spring Jndi Context e PropertyPlaceholderConfigurer

Read a Environment Variable in Java with Websphere

per definire i dati .... all'interno 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> 

Per vedere con Java

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

Ma io voglio prendere i dati nel mio common.xml like

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

magari con qualcosa di simile

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

ma con il contesto per fare lo stesso che

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

forse qualcosa di simile:

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

Chiunque conosce il modo corretto?

Grazie in anticipo

risposta

7

È possibile creare il proprio 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; 
    } 
} 

e poi utilizzarlo nella vostra applicationContext.xml

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

o per definire i valori predefiniti in un file di proprietà

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

Works, senza problemi .. Grazie mille – Kaltresian

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

In my-jndi.properties: JNDI-qconnfactory = JMS/QConnFactory

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

che sto facendo la stessa cosa nella mia webapplication ma in grado di leggere da InitialContext

ApplicationContext. 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 ha

default_mask=9999 

cercando di leggere

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

ma vincolante ha solo env-entry del contesto dal web.xml, non dal file properties

1

Se si desidera ottenere il valore di una variabile che è stata definita nel contesto contenitore e utilizzarla come stringa senza creare un oggetto segnaposto, è possibile eseguire quanto segue (questo è stato testato in Tomcat ma molto probabilmente funziona lo stesso in altri/server contenitore JEE come WebSphere):

Definire la variabile d'ambiente in Tomcat di context.xml (o usare la sintassi del proprio server):

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

nel XML Primavera file di contesto:

Aggiungere lo spazio dei nomi Jee per l'elemento principale:

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

e nella la xsi:schemaLocation:

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

Ora si può facilmente cercare un valore (si noti che non è necessario specificare il java:/comp/env roba, Primavera fa per voi):

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

quindi è possibile utilizzare, ad esempio passarlo al costruttore di un fagiolo come riferimento ENCE:

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

Il fagiolo riceverà "hello" come il suo arg construcotr.

EDIT:

Se si esegue il contesto Primavera di fuori del contenitore (Tomcat, Websphere ...) per il test di integrazione, la ricerca non funziona. Quindi, se si dispone di un contesto di prova speciale, è sufficiente aggiungere il String seguente definizione che sostituisce il jee:lookup e impostare il valore che si desidera utilizzare per il test:

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