Wie gebe ich Werte in einer Properties-Datei, so dass sie mit Resource # getStringArray abgerufen werden?
-
03-07-2019 - |
Frage
Ich versuche ResourceBundle#getStringArray
zu verwenden, um eine String[]
aus einer Properties-Datei abgerufen werden. Die Beschreibung dieser Methode in der Dokumentation lautet:
Ruft eine String-Array für den gegebenen Schlüssel aus diesem Ressourcenbündel oder einen seiner Eltern.
Allerdings habe ich versucht, die Werte in den Eigenschaften zu speichern, wie mehrere einzelne Schlüssel / Wert-Paare-Datei:
key=value1
key=value2
key=value3
und als kommagetrennte Liste:
key=value1,value2,value3
aber keiner von ihnen ist abrufbarer ResourceBundle#getStringArray
verwendet wird.
Wie kann man eine Reihe von Schlüssel / Wert-Paare in einer Eigenschaften repräsentieren Datei, so dass sie mit ResourceBundle#getStringArray
abgerufen werden können?
Lösung
Ein Properties
Objekt halten kann Object
s , nicht nur String
s. Das neigt dazu, vergessen zu werden, weil sie überwiegend zu laden .properties-Dateien verwendet, und so oft nur String
s enthalten. Die Dokumentation dass bundle.getStringArray(key)
ist dem Aufruf (String[]) bundle.getObject(key)
Äquivalent Aufruf angibt. Das ist das Problem. Der Wert ist kein String[]
, es ist ein String
Ich würde vorschlagen, dass es in kommagetrennte Format und rief split()
auf dem Wert zu speichern.
Andere Tipps
Sie können mit Commons Configuration , welche Methoden hat getList
und getStringArray
, dass Sie eine Liste der durch Komma getrennte Strings abgerufen werden können.
Umm, sieht aus wie dies ein weit verbreitetes Problem ist, aus Fäden hier und hier .
Es scheint, entweder Sie nicht über die Methode und den Wert für ein Array selbst analysieren oder schreiben Sie Ihre eigene Resource Implementierung und do it yourself :(. Vielleicht gibt es ein Apache Commons Projekt für diesen ...
Von dem JDK-Quellcode, den Property scheint nicht unterstützt wird.
Beispiel:
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;
}
Ich glaube nicht, das ist möglich mit Resource aus einer Properties-Datei geladen. Die Property nutzt die Eigenschaften Klasse, um die Eigenschaften-Datei zu laden. Die Eigenschaften der Klasse lädt eine Eigenschaft als eine Reihe von String-> String Map-Einträgen Datei und bietet keine Unterstützung für String [] Werte ziehen.
Beim ResourceBundle.getStringArray gerade ruft ResourceBundle.getObject, das Ergebnis in einen String Casting []. Da die Property nur Hände dies auf die Eigenschaften aus Instanz es aus der Datei geladen wird, werden Sie nie in der Lage sein, dies mit dem aktuellen Aktienproperty zu arbeiten.
nur Frühling verwenden - Frühling .properties-Datei: get-Element als ein Array
relevanter Code:
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;
}
Ich habe dies versucht und einen Weg finden könnte. Eine Möglichkeit ist es, eine Unterklasse von Listresourcebundle zu definieren, dann Instanzvariable vom Typ String definieren [] und weisen Sie den Wert auf den Schlüssel .. hier ist der Code
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
String[] str1 = {"L1","L2"};
return new Object[][]{
{"name",str1},
{"country","UK"}
};
}