Come posso specificare i valori in un file delle proprietà in modo che possano essere recuperati utilizzando ResourceBundle # getStringArray?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto cercando di usare ResourceBundle # getStringArray per recuperare un String [] da un file delle proprietà. La descrizione di questo metodo nella documentazione recita:

  

Ottiene una matrice di stringhe per la chiave fornita da questo pacchetto di risorse o da uno dei suoi genitori.

Tuttavia, ho tentato di memorizzare i valori nel file delle proprietà come più coppie chiave / valore singole:

key=value1
key=value2
key=value3

e come elenco delimitato da virgole:

key=value1,value2,value3

ma nessuno di questi è recuperabile utilizzando ResourceBundle # getStringArray .

Come si rappresenta un insieme di coppie chiave / valore in un file delle proprietà in modo tale che possano essere recuperate utilizzando ResourceBundle # getStringArray ?

È stato utile?

Soluzione

Un oggetto Properties può contenere Object s , non solo String . Ciò tende a essere dimenticato perché sono utilizzati in modo schiacciante per caricare file .properties e così spesso conterranno solo String . La documentazione indica che chiamare bundle.getStringArray (key) equivale a chiamare (String []) bundle.getObject (chiave) . Questo è il problema: il valore non è un String [] , è un String .

Suggerirei di memorizzarlo nel formato delimitato da virgole e di chiamare split () sul valore.

Altri suggerimenti

Puoi utilizzare Commons Commons , che ha metodi getList e getStringArray che consentono di recuperare un elenco di stringhe separate da virgola.

Umm, sembra che questo sia un problema comune, dai thread qui e qui .

Sembra che tu non usi il metodo e analizzi tu stesso il valore di un array o tu scriva la tua implementazione di ResourceBundle e lo fai tu stesso :(. Forse c'è un progetto commons apache per questo ...

Dal codice sorgente JDK, sembra che PropertyResourceBundle non lo supporti.

Esempio:

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

Non credo che ciò sia possibile con ResourceBundles caricati da un file delle proprietà. PropertyResourceBundle sfrutta la classe Properties per caricare il file delle proprietà. La classe Properties carica un file delle proprietà come un insieme di voci della mappa String- > String e non supporta l'estrazione di valori String [].

La chiamata a ResourceBundle.getStringArray chiama semplicemente ResourceBundle.getObject, trasmettendo il risultato a String []. Dal momento che PropertyResourceBundle lo consegna all'istanza Properties caricata dal file, non sarai mai in grado di farlo funzionare con l'attuale PropertyResourceBundle.

usa solo spring - Spring .properties file: get element as an Array

codice pertinente:

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

Ho provato questo e ho trovato un modo. Un modo è definire una sottoclasse di ListresourceBundle, quindi definire una variabile di istanza di tipo String [] e assegna il valore alla chiave .. ecco il codice

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

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

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top