如何在属性文件中指定值,以便可以使用ResourceBundle#getStringArray检索它们?
-
03-07-2019 - |
题
我正在尝试使用 ResourceBundle#getStringArray
从属性文件中检索 String []
。文档中对此方法的描述如下:
从此资源包或其父项之一获取给定键的字符串数组。
但是,我试图将属性文件中的值存储为多个单独的键/值对:
key=value1
key=value2
key=value3
以逗号分隔的列表:
key=value1,value2,value3
但这些都不能使用 ResourceBundle #getStringArray
检索。
如何在属性文件中表示一组键/值对,以便可以使用 ResourceBundle#getStringArray
检索它们?
解决方案
Properties
对象可以包含 Object
s ,而不仅仅是 String
。这往往被遗忘,因为它们绝大多数用于加载.properties文件,因此通常只包含 String
。 文档表明调用 bundle.getStringArray(key)
等同于调用(String [])bundle.getObject (密钥)代码>。这就是问题所在:值不是
String []
,它是 String
。
我建议以逗号分隔的格式存储它,并在值上调用 split()
。
其他提示
您可以使用 Commons Configuration ,其中包含方法 getList
和 getStringArray
,允许您检索逗号分隔字符串列表。
示例:
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;
}
我不相信从属性文件加载的ResourceBundles可以实现这一点。 PropertyResourceBundle利用Properties类来加载属性文件。 Properties类将属性文件作为一组String-&gt; String映射条目加载,并且不支持拉出String []值。
调用ResourceBundle.getStringArray只调用ResourceBundle.getObject,将结果转换为String []。由于PropertyResourceBundle只是将其移交给从文件加载的Properties实例,因此您永远无法使用当前的库存PropertyResourceBundle。
只需使用spring - Spring .properties文件:get element as a阵列
相关代码:
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;
}
我试过这个并找到了办法。 一种方法是定义ListresourceBundle的子类,然后定义String []类型的实例变量 并将值赋给键..这是代码
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
String[] str1 = {"L1","L2"};
return new Object[][]{
{"name",str1},
{"country","UK"}
};
}