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

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

Получает строковый массив для данного ключа из этого набора ресурсов или одного из его родителей.

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

key=value1
key=value2
key=value3

и в виде списка через запятую:

key=value1,value2,value3

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

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

Ответы [ 9 ]

32 голосов
/ 22 октября 2008

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

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

7 голосов
/ 18 августа 2009

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

4 голосов
/ 22 октября 2008

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

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

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

2 голосов
/ 04 февраля 2013

пример:

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;
}
1 голос
/ 12 мая 2015
key=value1;value2;value3

String[] toArray = rs.getString("key").split(";");
1 голос
/ 27 апреля 2015

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

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

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

@Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
1 голос
/ 22 октября 2008

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

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

0 голосов
/ 27 декабря 2014

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

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

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

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
0 голосов
/ 23 октября 2008
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...