2013-02-07 22 views
9

कामयाब रहा है एक गुण इस तरह दायर:वसंत में एक गतिशील संपत्ति नक्शा पढ़ना सेम

my.properties file: 
app.One.id=1 
app.One.val=60 

app.Two.id=5 
app.Two.val=75 

और मैं इस तरह स्प्रिंग कॉन्फ़िग फ़ाइल में एक नक्शा संपत्ति मेरी सेम में में इन मूल्यों को पढ़ें:

spring-config.xml: 
<bean id="myBean" class="myClass" scope="singleton"> 
    <property name="myMap"> 
     <map> 
      <entry key="${app.One.id}" value="${app.One.val}"/> 
      <entry key="${app.Two.id}" value="${app.Two.val}"/> 
     </map> 
    </property> 
</bean> 

इस तरह यदि मैं गुण फ़ाइल में एक नया आईडी/वैल जोड़ता हूं, तो मुझे myMap में नया आईडी/वैल रखने के लिए कॉन्फ़िगर xml में एक पंक्ति जोड़नी होगी।

मेरा प्रश्न है, वसंत कॉन्फ़िगरेशन फ़ाइल में कुंजी-वैल जोड़े निर्दिष्ट करने का कोई तरीका है ताकि एक्सएमएल में परिभाषित की-वल्स की संख्या गुण फ़ाइल में आइटमों को समझ सके और नक्शा बना सके। असल में मैं इस एक्सएमएल फ़ाइल को विभिन्न परिवेशों में उपयोग करना चाहता हूं जहां हम गुण फ़ाइल में विभिन्न प्रकार की कुंजी-मान वस्तुओं का उपयोग करते हैं। मैं इन सभी मानों में पढ़ने के लिए प्रत्येक वातावरण में xml फ़ाइल को बदलना नहीं चाहता हूं।

मुझे बताएं कि आपको किसी अन्य विवरण की आवश्यकता है या नहीं। किसी भी विचार/टिप्पणियों की सराहना की जाती है। धन्यवाद!

+0

तुम मेरे समाधान धन्यवाद की समीक्षा कर सके। – Vitaly

उत्तर

7

यह वसंत ईएल और कस्टम से निपटने के साथ किया जाता है।

यह कोशिश करने के लिए मेरे लिए बस दिलचस्प था। यह काम करता है :)

application.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd 
    "> 

    <util:properties id="values" location="values.properties" /> 

    <bean id="hello" class="my.Hello"> 
     <property name="map" 
      value="#{T(my.Utils).propsToMap(values, '^(app\.\w*)\.id$', '{idGroup}.val')}" /> 
    </bean> 

</beans> 

Utils.java

package my; 

import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Properties; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Utils { 

    public static Map<String, String> propsToMap(Properties props, 
      String idPatternString, String valuePatternString) { 

     Map<String, String> map = new HashMap<String, String>(); 

     Pattern idPattern = Pattern.compile(idPatternString); 

     for (Enumeration<?> en = props.propertyNames(); en.hasMoreElements();) { 
      String key = (String) en.nextElement(); 
      String mapKey = (String) props.getProperty(key); 

      if (mapKey != null) { 
       Matcher idMatcher = idPattern.matcher(key); 
       if (idMatcher.matches()) { 

        String valueName = valuePatternString.replace("{idGroup}", 
          idMatcher.group(1)); 
        String mapValue = props.getProperty(valueName); 

        if (mapValue != null) { 
         map.put(mapKey, mapValue); 
        } 
       } 
      } 
     } 

     return map; 
    } 
} 

Hello.java

package my; 

import java.util.Map; 

public class Hello { 

    private Map<String, String> map; 

    public Map<String, String> getMap() { 
     return map; 
    } 

    public void setMap(Map<String, String> map) { 
     this.map = map; 
    } 
} 

values.properties

app.One.id=1 
app.One.val=60 

app.Two.id=5 
app.Two.val=75 
1

यह एक क्लासिक पर्यावरण समस्या है।

ऐसा करने के दो तरीके हैं:

  1. उचित .properties फ़ाइल के अंत में एक वातावरण स्ट्रिंग जोड़ें; ऐप को उस मान को पास करें जब यह शुरू होता है और स्प्रिंग को सही चुनने दें।
  2. उन गतिशील गुणों को डेटाबेस में रखें और स्टार्टअप पर उनके लिए क्वेरी करें। डेटाबेस के लिए जेएनडीआई सही मूल्यों को चुन देगा।
+0

हम डीबी का उपयोग करके ऐसा नहीं करना चाहते हैं। मैं कुछ और [जैसे] (http://stackoverflow.com/questions/5274362/reading-a- गतिशील-property-list-into-a-pring-managed-bean) की तरह कुछ और ढूंढ रहा था। वहां यह आसान है क्योंकि यह सिर्फ एक सूची है, लेकिन मैं सोच रहा था कि नक्शे के साथ कुछ समकक्ष उपयोग किया गया है या नहीं? – kriver

+0

संपत्ति आईएस-ए मानचित्र के बाद से, मुझे नहीं लगता कि क्यों नहीं। कोशिश करो। – duffymo

0

मुझे गतिशील मानचित्र जानकारी वसंत कॉन्फ़िगरेशन जानकारी में पढ़ने के लिए इस समस्या को हल करने का एक आदर्श तरीका नहीं मिला। डीबी का उपयोग करना हमारे लिए भी एक विकल्प नहीं था। यह वही है मैं इस के लिए सबसे अच्छा विकल्प पाया है:

  • मानचित्र कुंजी के लिए एक मानक प्रारूप का उपयोग करें/गुण में मान युग्म फ़ाइल जैसे: कुंजी 1 | val1, key2 | val2, key3 | val3, ..., keyn | Valn

  • यहाँ की तरह एक स्ट्रिंग संपत्ति या विन्यास सेम में सूची संपत्ति को यह पढ़ें: Use String to List

  • Let इंजेक्शन जावा वर्ग सेटर में नक्शे में आइटम अलग हो गए।

मैं इसे उत्तर के रूप में चिह्नित करने जा रहा हूं। अगर किसी और के पास ऐसा करने के बेहतर तरीके हैं, तो इसे टिप्पणी करें और मैं इसे उत्तर देने के लिए बदल दूंगा।

4

शायद मैं इस मुद्दे को पूरी तरह से समझ नहीं पाया ...
एक सरल दृष्टिकोण के बारे में क्या?

my.properties file: 
1=60 
5=75 

आवेदन संदर्भ

<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="locations"> 
     <list> 
     <value>classpath: my.properties</value> 
     </list> 
    </property> 
</bean> 
<bean id="myClass" class="com.pakage.MyClass"> 
    <property name="myMap" ref=" myProperties"/> 
</bean> 

जावा बीन

public class MyClass { 
    private Map<String , String> myMap; 

    public void setMyMap(Map<String, String> myMap) { 
     this.myMap = myMap; 
    } 

    public Map<String , String> getMyMap(){ 
     return myMap; 
    } 
} 
संबंधित मुद्दे