Como faço para especificar valores em um arquivo de propriedades para que eles possam ser recuperados usando ResourceBundle # getStringArray?

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

  •  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?

Foi útil?

Solução

Um objeto Properties pode conter Objects , e não apenas Strings. Que tende a ser esquecido, porque eles são esmagadoramente usado para arquivos .properties de carga, e assim muitas vezes só irá conter Strings. 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"}                
    };
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top