Wie gebe ich Werte in einer Properties-Datei, so dass sie mit Resource # getStringArray abgerufen werden?

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

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

War es hilfreich?

Lösung

Ein Properties Objekt halten kann Objects , nicht nur Strings. Das neigt dazu, vergessen zu werden, weil sie überwiegend zu laden .properties-Dateien verwendet, und so oft nur Strings 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"}                
    };
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top