ResourceBundle#getStringArrayを使用して値を取得できるように、プロパティファイルで値を指定するにはどうすればよいですか?
-
03-07-2019 - |
質問
ResourceBundle#getStringArray
を使用して、プロパティファイルから String []
を取得しようとしています。ドキュメント内のこのメソッドの説明は次のとおりです。
このリソースバンドルまたはその親のいずれかから、指定されたキーの文字列配列を取得します。
ただし、プロパティファイルに複数の個別のキー/値ペアとして値を保存しようとしました:
key=value1
key=value2
key=value3
およびカンマ区切りリストとして:
key=value1,value2,value3
ただし、これらはどちらも ResourceBundle#getStringArray
を使用して取得できません。
ResourceBundle#getStringArray
を使用して取得できるように、プロパティファイルでキー/値のペアのセットをどのように表現しますか?
解決
Properties
オブジェクトは、 String
sだけでなく、 Object
s を保持できます。 .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 .propertiesファイル:要素を取得配列
関連コード:
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;
}
これを試しましたが、方法を見つけることができました。 1つの方法は、ListresourceBundleのサブクラスを定義してから、String []型のインスタンス変数を定義することです キーに値を割り当てます。ここにコードがあります
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
String[] str1 = {"L1","L2"};
return new Object[][]{
{"name",str1},
{"country","UK"}
};
}