Como faço para especificar valores em um arquivo de propriedades para que eles possam ser recuperados usando ResourceBundle # getStringArray?
-
03-07-2019 - |
Pergunta
Eu estou tentando usar ResourceBundle#getStringArray
para recuperar um String[]
a partir de um arquivo de propriedades. A descrição deste método na documentação lê:
Obtém uma matriz de cadeia para a chave dada a partir deste pacote de recursos ou um de seus pais.
No entanto, tenho tentado para armazenar os valores no arquivo de propriedades como vários pares de chave individual / valor:
key=value1
key=value2
key=value3
e como uma lista delimitada por vírgula:
key=value1,value2,value3
Mas nenhuma dessas é recuperável usando ResourceBundle#getStringArray
.
Como você representar um conjunto de pares chave / valor em um arquivo de propriedades de modo que possam ser recuperadas usando ResourceBundle#getStringArray
?
Solução
Um objeto Properties
pode conter Object
s , e não apenas String
s. Que tende a ser esquecido, porque eles são esmagadoramente usado para arquivos .properties de carga, e assim muitas vezes só irá conter String
s. a documentação indica que chamar bundle.getStringArray(key)
é equivalente a chamar (String[]) bundle.getObject(key)
. Esse é o problema:. O valor não é um String[]
, é um String
Eu sugiro armazenando-o em formato delimitado por vírgulas e chamando split()
sobre o valor.
Outras dicas
Você pode usar Commons Configuração , que tem métodos getList
e getStringArray
que permitem que você recuperar uma lista de valores separados por vírgulas strings.
Umm, parece que este é um problema comum, a partir de fios aqui e aqui .
Parece ou você não use o método e analisar o valor de um array si mesmo ou você escrever sua própria implementação ResourceBundle e fazê-lo sozinho :(. Talvez haja um Apache commons projetar para este ...
A partir do código fonte JDK, parece que o PropertyResourceBundle não apoiá-lo.
exemplo:
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;
}
Eu não acredito que isso é possível com ResourceBundles carregados a partir de um arquivo de propriedades. O PropertyResourceBundle aproveita classe para carregar o arquivo de propriedades de propriedades. As propriedades cargas de classe um arquivo de propriedades como um conjunto de String> string entradas de mapa e não suporta retirando valores String [].
Chamando ResourceBundle.getStringArray apenas chama ResourceBundle.getObject, lançando o resultado para um String []. Desde o PropertyResourceBundle apenas mãos esta off para a instância Propriedades lo carregado a partir do arquivo, você nunca será capaz de chegar a este trabalho com o atual, estoque PropertyResourceBundle.
apenas o uso primavera - Primavera .properties file: elemento get como um matriz
código relevante:
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;
}
Eu tentei isso e poderia encontrar um caminho. Uma maneira é a definir uma subclasse de ListresourceBundle, em seguida, definir exemplo variável do tipo String [] e atribuir o valor para a chave .. aqui está o código
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
String[] str1 = {"L1","L2"};
return new Object[][]{
{"name",str1},
{"country","UK"}
};
}