Вопрос по java, spring, map, javabeans, dynamic – Чтение динамической карты свойств в управляемый компонент Spring

10

У меня есть файл свойств, как это:

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

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

И я прочитал эти значения в свойство карты в моем бине в конфигурационном файле Spring следующим образом:

spring-config.xml:

    
        
            
            
        
    

Таким образом, если я добавлю новый id / val в файл свойств, я должен добавить строку в config xml, чтобы иметь новый id / val в myMap.

У меня вопрос, есть ли способ указать пары ключ-вал в конфигурационном файле Spring, чтобы число ключей-ключей, определенных в xml, могло определить элементы в файле свойств и создать карту. По сути, я хочу использовать этот XML-файл в разных средах, где мы используем разное количество элементов значения ключа в файле свойств. Я просто неЯ не хочу изменять XML-файл в каждой среде, чтобы прочитать все эти значения.

Дайте мне знать, если вам нужны какие-либо другие детали. Любые мысли / комментарии приветствуются. Спасибо!

Не могли бы вы рассмотреть мое решение, спасибо. Vitaly

Ваш Ответ

4   ответа
4

Может быть, я не до конца понял проблему здесь ...

Как насчет упрощенного подхода?

my.properties file:
1=60
5=75

Контекст приложения


    
        
        classpath: my.properties
        
    
 

    

Java Bean

public class MyClass {
    private Map myMap;

    public void setMyMap(Map myMap) {
        this.myMap = myMap;
    }

    public Map getMyMap(){
        return myMap;
    }
}
1

Это'Классическая проблема окружающей среды.

Есть два способа сделать это:

Добавьте строку окружения в конце соответствующего файла .properties; передайте это значение приложению при запуске и позвольте Spring выбрать правильное значение.Поместите эти динамические свойства в базу данных и запросите их при запуске. JNDI для базы данных выберет правильные значения.
Так как недвижимость IS-A карта, я нене понимаю, почему нет. Попытайся. duffymo
Мы неЯ не хочу делать это с помощью БД. Я искал что-то более похожееВот, Вот этопроще как тоЭто просто список, но мне было интересно, есть ли что-то эквивалентное для использования с картами? kriver
8

Это делается с помощью Spring EL и пользовательской обработки.

Мне было просто интересно попробовать. Оно работает :)

application.xml



    

    
        
    


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 propsToMap(Properties props,
            String idPatternString, String valuePatternString) {

        Map map = new HashMap();

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

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }
}

values.properties

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

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

Я не нашел идеального способа решения этой проблемы, чтобы свойство динамической карты считывалось в информации о конфигурации Spring. Использование БД также не было вариантом для нас. Вот что я нашел лучшей альтернативой для этого:

Используйте стандартный формат для пары ключ / значение карты в файле свойств, например: key1 | val1, key2 | val2, key3 | val3, ..., keyn | valn

Прочтите это для свойства String или List в компоненте конфигурации, как здесь:Использовать строку в списке

Пусть введенный Java-класс разбивает элементы на карту в setter.I '

Я собираюсь отметить это как ответ. Если у кого-то есть лучшие способы сделать это, закомментируйте это, и я изменю это, чтобы ответить.

Похожие вопросы