¿Cómo especifico los valores en un archivo de propiedades para que puedan recuperarse usando ResourceBundle # getStringArray?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de usar ResourceBundle # getStringArray para recuperar una String [] de un archivo de propiedades. La descripción de este método en la documentación dice:

  

Obtiene una matriz de cadenas para la clave dada de este paquete de recursos o uno de sus padres.

Sin embargo, he intentado almacenar los valores en el archivo de propiedades como varios pares clave / valor individuales:

key=value1
key=value2
key=value3

y como una lista delimitada por comas:

key=value1,value2,value3

pero ninguno de estos es recuperable usando ResourceBundle # getStringArray .

¿Cómo representa un conjunto de pares clave / valor en un archivo de propiedades para que puedan recuperarse utilizando ResourceBundle # getStringArray ?

¿Fue útil?

Solución

Un objeto Propiedades puede contener Objeto s , no solo String s. Esto tiende a olvidarse porque se usan de manera abrumadora para cargar archivos .properties y, por lo general, solo contienen String s. La documentación indica que llamar a bundle.getStringArray (key) es equivalente a llamar a (String []) bundle.getObject (clave) . Ese es el problema: el valor no es un String [] , es un String .

Sugeriría almacenarlo en un formato delimitado por comas y llamar a split () en el valor.

Otros consejos

Puede usar Configuración de Commons , que tiene métodos getList y getStringArray que te permiten recuperar una lista de cadenas separadas por comas.

Umm, parece que este es un problema común, de los hilos here y here .

Parece que o no usas el método y analizas el valor de una matriz o escribes tu propia implementación de ResourceBundle y lo haces tú mismo :(. Tal vez haya un proyecto de apache commons para esto ...

Desde el código fuente de JDK, parece que PropertyResourceBundle no lo admite.

ejemplo:

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;
}

No creo que esto sea posible con ResourceBundles cargados desde un archivo de propiedades. PropertyResourceBundle aprovecha la clase de propiedades para cargar el archivo de propiedades. La clase de propiedades carga un archivo de propiedades como un conjunto de entradas de mapa de cadena > cadena y no admite la extracción de valores de cadena [].

Llamar a ResourceBundle.getStringArray simplemente llama a ResourceBundle.getObject, convirtiendo el resultado en una Cadena []. Ya que PropertyResourceBundle solo entrega esto a la instancia de Propiedades que se cargó desde el archivo, nunca podrá hacer que esto funcione con el actual PropertyResourceBundle.

simplemente use spring - archivo .properties de Spring: obtenga el elemento como un Array

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;
}

He intentado esto y podría encontrar una manera. Una forma es definir una subclase de ListresourceBundle, luego definir la variable de instancia de tipo String [] y asigne el valor a la clave ... aquí está el código

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

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

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top