web-dev-qa-db-fra.com

Comment spécifier des valeurs dans un fichier de propriétés afin qu'elles puissent être récupérées à l'aide de ResourceBundle # getStringArray?

J'essaie d'utiliser ResourceBundle#getStringArray pour récupérer un String[] à partir d'un fichier de propriétés. La description de cette méthode dans la documentation se lit comme suit:

Obtient un tableau de chaînes pour la clé donnée à partir de ce groupe de ressources ou de l'un de ses parents.

Cependant, j'ai tenté de stocker les valeurs dans le fichier de propriétés sous la forme de plusieurs paires clé/valeur individuelles:

key=value1
key=value2
key=value3

et en tant que liste délimitée par des virgules:

key=value1,value2,value3

mais aucun de ceux-ci n'est récupérable en utilisant ResourceBundle#getStringArray.

Comment représentez-vous un ensemble de paires clé/valeur dans un fichier de propriétés de sorte qu'elles puissent être récupérées à l'aide de ResourceBundle#getStringArray?

29
Grant Wagner

Un objet Properties peut contenir Objects, pas seulement Strings. Cela a tendance à être oublié car ils sont très utilisés pour charger des fichiers .properties et ne contiennent souvent que Strings. La documentation indique que l'appel de bundle.getStringArray(key) équivaut à l'appel de (String[]) bundle.getObject(key). C'est le problème: la valeur n'est pas un String[], c'est une String.

Je suggère de le stocker au format délimité par des virgules et d’appeler split() sur la valeur.

32
Robert J. Walker

Vous pouvez utiliser Commons Configuration , qui utilise les méthodes getList et getStringArray qui vous permettent de récupérer une liste de chaînes séparées par des virgules.

7
João Silva

Umm, on dirait que c'est un problème commun, à partir de fils ici et ici .

Il semble que vous n'utilisiez pas la méthode et n'analysiez pas vous-même la valeur d'un tableau ou que vous écriviez votre propre implémentation ResourceBundle et le fassiez vous-même :(. Peut-être existe-t-il un projet commun Apache pour cela ... 

D'après le code source de JDK, le PropertyResourceBundle ne le prend pas en charge.

4
Chris Kimpton

exemple:

[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;
}
2
Murlo

il suffit d’utiliser spring - Spring .properties file: obtenir l’élément sous forme de tableau

code pertinent:

base.module.elementToSearch=1,2,3,4,5,6

@Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
1
chrismarx

Je ne crois pas que cela soit possible avec ResourceBundles chargé à partir d'un fichier de propriétés. PropertyResourceBundle exploite la classe Properties pour charger le fichier de propriétés. La classe Properties charge un fichier de propriétés sous la forme d'un ensemble d'entrées de mappe String-> String et ne prend pas en charge l'extraction des valeurs String [].

L'appel de ResourceBundle.getStringArray appelle tout simplement ResourceBundle.getObject, en convertissant le résultat en String []. Etant donné que PropertyResourceBundle ne fait que transférer cela à l'instance de propriétés qu'il a chargée à partir du fichier, vous ne pourrez jamais le faire fonctionner avec le PropertyResourceBundle en stock actuel.

1
Alan Krueger
key=value1;value2;value3

String[] toArray = rs.getString("key").split(";");
1
Sujith

J'ai essayé ceci et je pourrais trouver un moyen… .. Une solution consiste à définir une sous-classe de ListresourceBundle, puis à définir une variable d'instance de type String []

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

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

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
0
Lokesh Garg
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;
}
0
Yonin