Как мне указать значения в файле свойств, чтобы их можно было получить с помощью ResourceBundle#getStringArray?
-
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"}
};
}