2013-02-07 7 views
9

を管理:は性質がこのようなファイル私が持っている豆

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

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

そして、私はこのような春のコンフィグファイル内の私のBeanのマッププロパティにこれらの値を読む:

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> 

この方法では、プロパティファイルに新しいid/valを追加すると、新しいID/valをmyMapに入れるためにconfig xmlに行を追加する必要があります。

私の質問は、xmlで定義されたキーの数がプロパティファイルの項目を見つけてマップを作成できるように、スプリング設定ファイルでキーとバレルの組を指定する方法があるかどうかです。基本的には、このXMLファイルをプロパティファイルで異なる数のKey-Value項目を使用する異なる環境で使用したいと考えています。私は各環境でxmlファイルを変更して、これらの値すべてを読み込みたくないだけです。

他の詳細が必要な場合はお知らせください。どんな考え/コメントも感謝します。ありがとう!

+0

あなたが私の解決策、感謝を見直しでした。 – Vitaly

答えて

7

これは春ELおよびカスタム処理で行われます。

私はそれを試してみると面白かったです。それは動作します:)

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

これは古典的な環境問題です。

これを行うには、次の2つの方法があります。

  1. は、適切な.propertiesファイルの末尾に環境文字列を追加します。その値をアプリケーションに渡してから、Springが正しい値を選択させるようにしてください。
  2. これらの動的プロパティをデータベースに入れ、起動時にこれらのプロパティを照会します。データベースのJNDIが正しい値を選択します。
+0

DBを使用してこれを行う必要はありません。私は[ここ](http://stackoverflow.com/questions/5274362/reading-a-dynamic-property-list-into-a-spring-managed-bean)のような何かを探していた。単なるリストなので簡単ですが、マップに使用するのに相当するものがあるかどうか疑問に思っていましたか? – kriver

+0

プロパティIS-Aマップなので、なぜそうは見えないのですか?それを試してみてください。 – duffymo

0

私はこの問題を解決し、ダイナミックマッププロパティをバネ構成情報に読み込むための理想的な方法は見つけられませんでした。 DBの使用も私たちの選択肢ではありませんでした。これは私がこのための最善の選択肢であることが判明何である:

  • は、例えば ファイルのプロパティにマップのキー/値のペアのための標準フォーマットを使用します。KEY1を| val1、key2 | val2、key3 | val3、...、keyn |

  • VALN

    はここのようなコンフィグレーションBeanのStringプロパティまたはリストプロパティにこれを読む:Use String to List

  • レッツ注入されたJavaクラスは、セッターにマップにアイテムを分割します。

これを回答としてマークします。他の誰かがこれを行うより良い方法を持っているなら、それをコメントアウトして、私はそれを答えに変えるでしょう。

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> 

Java 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; 
    } 
} 
関連する問題