2012-01-25 13 views
6

वसंत का उपयोग करके, मैं वेबस्पेयर के संदर्भ में एक चर को पढ़ना चाहता हूं।वसंत जेन्डी संदर्भ और संपत्ति प्लेसधारक कॉन्फ़िगरर

Read a Environment Variable in Java with 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> 

अंदर जावा

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> 

किसी सही तरीका जानता है?

अग्रिम धन्यवाद

उत्तर

7

आप अपनी खुद की 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> 
+0

काम करता है, .. बहुत बहुत धन्यवाद – Kaltresian

0
<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}"/> 
1

मैं अपने WebApplication में ही बात कर रहा हूँ, लेकिन InitialContext

applicationcontext से पढ़ने में असमर्थ। एक्सएमएल

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

0 है
default_mask=9999 

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

लेकिन संदर्भ के बंधन केवल वेब से env-प्रविष्टि है पढ़ने के लिए कोशिश कर रहा।एक्सएमएल, नहीं से गुण फ़ाइल

1

तुम सिर्फ एक चर कि कंटेनर संदर्भ में परिभाषित किया गया था के मूल्य मिलता है और, आप निम्न कर सकते एक प्लेसहोल्डर वस्तु बनाने के बिना एक स्ट्रिंग के रूप में उपयोग करना चाहते हैं (यह परीक्षण किया गया था बिलाव में लेकिन सबसे अधिक संभावना अन्य कंटेनर/जेईई ऐसे WebSphere के रूप में) सर्वर में एक ही काम करता है:

बिलाव के context.xml में वातावरण चर को परिभाषित करें (या अपने खुद के सर्वर की वाक्य रचना):

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

स्प्रिंग एक्सएमएल में संदर्भ फ़ाइल:

मूल तत्व को जेईई नाम स्थान जोड़ें:

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

सेम अपने construcotr आर्ग के रूप में "hello" प्राप्त होगा।

संपादित करें:

आप एकीकरण परीक्षण के लिए कंटेनर (बिलाव, 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> 
संबंधित मुद्दे