relativa - recorrer properties java
¿Cómo especifico valores en un archivo de propiedades para que se puedan recuperar utilizando ResourceBundle#getStringArray? (9)
Estoy tratando de usar ResourceBundle#getStringArray
para recuperar un 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 múltiples 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 se representa un conjunto de pares clave / valor en un archivo de propiedades para que se puedan recuperar utilizando ResourceBundle#getStringArray
?
No creo que esto sea posible con ResourceBundles cargado desde un archivo de propiedades. PropertyResourceBundle aprovecha la clase Properties para cargar el archivo de propiedades. La clase Propiedades carga un archivo de propiedades como un conjunto de entradas String-> String map y no admite extraer valores String [].
Llamar a ResourceBundle.getStringArray simplemente llama a ResourceBundle.getObject, lanzando el resultado a String []. Dado que PropertyResourceBundle simplemente entrega esto a la instancia de Propiedades que cargó desde el archivo, nunca podrá hacer que funcione con el stock actual PropertyResourceBundle.
Umm, parece que este es un problema común, de los hilos aquí y aquí .
Parece que no utilizas el método y analizas el valor de una matriz tú mismo o escribes tu propia implementación de ResourceBundle y lo haces tú mismo :(. Tal vez haya un proyecto de Apache commons para esto ...
A partir del código fuente de JDK, parece que PropertyResourceBundle no lo admite.
Un objeto Properties
puede contener Object
s , no solo String
s. Eso tiende a olvidarse porque se usan abrumadoramente para cargar archivos .properties, y tan a menudo solo contendrán String
. La documentación indica que llamar a bundle.getStringArray(key)
es equivalente a llamar (String[]) bundle.getObject(key)
. Ese es el problema: el valor no es una String[]
, es una String
.
Sugeriría almacenarlo en formato delimitado por comas y llamar a split()
en el valor.
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;
}
ejemplo:
[email protected], [email protected]
..
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;
}
Puede usar Commons Configuration , que tiene los métodos getList
y getStringArray
que le permiten recuperar una lista de cadenas separadas por comas.
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 asignar 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"}
};
}
key=value1;value2;value3
String[] toArray = rs.getString("key").split(";");
solo use el resorte - Archivo Spring .properties: get element as a Array
código relevante:
base.module.elementToSearch=1,2,3,4,5,6
@Value("${base.module.elementToSearch}")
private String[] elementToSearch;