10

私はこのようなプロパティファイルを持っています:

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

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

そして、これらの値を次のようにSpring構成ファイルのBeanのmapプロパティに読み込みます。

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を追加する場合、myMapに新しいid / valを含めるには、configxmlに行を追加する必要があります。

私の質問は、春の設定ファイルでキーと値のペアを指定して、xmlで定義されたキーと値の数がプロパティファイルの項目を把握してマップを作成できるようにする方法はありますか?基本的に、このxmlファイルは、プロパティファイルでさまざまな数のKey-Valueアイテムを使用するさまざまな環境で使用したいと思います。これらすべての値を読み取るために、各環境のxmlファイルを変更したくありません。

他に詳細が必要な場合はお知らせください。任意の考え/コメントをいただければ幸いです。ありがとう!

4

4 に答える 4

8

これは、SpringELとカスタム処理を使用して行われます。

試してみるのは面白かったです。できます :)

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
于 2013-04-15T07:12:12.140 に答える
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;
    }
}
于 2013-04-14T15:00:22.153 に答える
1

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

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

  1. 適切な.propertiesファイルの最後に環境文字列を追加します。アプリの起動時にその値をアプリに渡し、Springに正しい値を選択させます。
  2. これらの動的プロパティをデータベースに配置し、起動時にクエリを実行します。データベースのJNDIは、適切な値を選択します。
于 2013-02-07T20:19:46.840 に答える
0

この問題を解決して、動的マッププロパティをSpring構成情報に読み込む理想的な方法が見つかりませんでした。DBを使用することも私たちの選択肢ではありませんでした。これは私がこれに対する最良の選択肢であると私が見つけたものです:

  • プロパティファイルのマップキー/値ペアに標準形式を使用します。例:key1 | val1、key2 | val2、key3 | val3、...、keyn | valn

  • これを次のように構成BeanのStringプロパティまたはListプロパティに読み取ります。Stringを使用してリストする

  • インジェクトされたJavaクラスがアイテムをsetterのマップに分割します。

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

于 2013-02-14T19:46:19.513 に答える