Как мне указать значения в файле свойств, чтобы их можно было получить с помощью ResourceBundle#getStringArray?

StackOverflow https://stackoverflow.com/questions/226050

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать ResourceBundle#getStringArray чтобы получить String[] из файла свойств.Описание этого метода в документации гласит:

Получает массив строк для данного ключа из этого пакета ресурсов или одного из его родительских элементов.

Однако я попытался сохранить значения в файле свойств в виде нескольких отдельных пар ключ / значение:

key=value1
key=value2
key=value3

и в виде списка, разделенного запятыми:

key=value1,value2,value3

но ни один из них не может быть восстановлен с помощью ResourceBundle#getStringArray.

Как вы представляете набор пар ключ / значение в файле свойств таким образом, чтобы их можно было извлечь с помощью ResourceBundle#getStringArray?

Это было полезно?

Решение

Объект Properties может содержать Object s , а не только String s. Как правило, об этом забывают, потому что они в подавляющем большинстве случаев используются для загрузки файлов .properties и часто содержат только String . В документации указывается, что вызов bundle.getStringArray (key) эквивалентен вызову (String []) bundle.getObject (ключ) . Вот в чем проблема: значение не является String [] , это String .

Я бы предложил сохранить его в формате с разделителями-запятыми и вызвать split () для значения.

Другие советы

Вы можете использовать конфигурацию Commons , которая имеет методы getList и getStringArray , которые позволяют получать список строк, разделенных запятыми.

Похоже, это обычная проблема из потоков здесь и здесь .

Похоже, вы либо не используете метод и не анализируете значение для массива самостоятельно, либо пишете собственную реализацию ResourceBundle и делаете это сами :(. Возможно, для этого есть проект Apache Commons ...

Судя по исходному коду JDK, PropertyResourceBundle не поддерживает его.

пример:

mail.ccEmailAddresses=he@anyserver.at, she@anotherserver.at

..

myBundle=PropertyResourceBundle.getBundle("mailTemplates/bundle-name", _locale);

..

public List<String> getCcEmailAddresses() 
{
    List<String> ccEmailAddresses=new ArrayList<String>();
    if(this.myBundle.containsKey("mail.ccEmailAddresses"))
    {
        ccEmailAddresses.addAll(Arrays.asList(this.template.getString("mail.ccEmailAddresses").split("\\s*(,|\\s)\\s*")));// 1)Zero or more whitespaces (\\s*) 2) comma, or whitespace (,|\\s) 3) Zero or more whitespaces (\\s*)
    }       
    return ccEmailAddresses;
}

Я не верю, что это возможно с ResourceBundles, загруженным из файла свойств. PropertyResourceBundle использует класс Properties для загрузки файла свойств. Класс Properties загружает файл свойств в виде набора записей карты String-> String и не поддерживает извлечение значений String [].

Вызов ResourceBundle.getStringArray просто вызывает ResourceBundle.getObject, приводя результат к String []. Поскольку PropertyResourceBundle просто передает это экземпляру Properties, который он загрузил из файла, вы никогда не сможете заставить его работать с текущим фондовым PropertyResourceBundle.

просто используйте spring - Файл Spring .properties: получить элемент как Массив

соответствующий код:

base.module.elementToSearch=1,2,3,4,5,6

@Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
key=value1;value2;value3

String[] toArray = rs.getString("key").split(";");
public String[] getPropertyStringArray(PropertyResourceBundle bundle, String keyPrefix) {
    String[] result;
    Enumeration<String> keys = bundle.getKeys();
    ArrayList<String> temp = new ArrayList<String>();

    for (Enumeration<String> e = keys; keys.hasMoreElements();) {
        String key = e.nextElement();
        if (key.startsWith(keyPrefix)) {
            temp.add(key);
        }
    }
    result = new String[temp.size()];

    for (int i = 0; i < temp.size(); i++) {
        result[i] = bundle.getString(temp.get(i));
    }

    return result;
}

Я пробовал это и мог найти способ. Одним из способов является определение подкласса ListresourceBundle, а затем определение переменной экземпляра типа String [] и назначьте значение ключу .. вот код

@Override
protected Object[][] getContents() {
    // TODO Auto-generated method stub

    String[] str1 = {"L1","L2"};

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top