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?

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

  •  03-07-2019
  •  | 
  •  

Question

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 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 sous forme de liste délimitée par des virgules:

key=value1,value2,value3

mais aucun de ceux-ci n'est récupérable à l'aide de 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 ?

Était-ce utile?

La solution

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

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

Autres conseils

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

Humm, cela semble être un problème courant dans les discussions ici et ici . / p>

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 que vous le fassiez vous-même :(. Peut-être existe-t-il un projet commun apache pour cela ...

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

exemple:

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

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 simplement ResourceBundle.getObject, en convertissant le résultat en String []. Etant donné que PropertyResourceBundle ne fait que passer cela à l'instance de propriétés qu'il a chargée à partir du fichier, vous ne pourrez jamais obtenir que cela fonctionne avec le PropertyResourceBundle en stock actuel.

utilisez simplement le printemps - fichier Spring .properties: obtenez l'élément en tant que Tableau

code pertinent:

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

J'ai essayé cela et je pouvais trouver un moyen. Une solution consiste à définir une sous-classe de ListresourceBundle, puis à définir une variable d'instance de type String []. et attribuer la valeur à la clé .. voici le code

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

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

    return new Object[][]{

            {"name",str1},
            {"country","UK"}                
    };
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top