web-dev-qa-db-ja.com

ResourceBundle#getStringArrayを使用して取得できるように、プロパティファイルで値を指定するにはどうすればよいですか?

プロパティファイルからResourceBundle#getStringArrayを取得するためにString[]を使用しようとしています。ドキュメントでのこのメソッドの説明は次のとおりです。

このリソースバンドルまたはその親の1つから、指定されたキーの文字列配列を取得します。

ただし、値を複数の個別のキー/値のペアとしてプロパティファイルに保存しようとしました。

key=value1
key=value2
key=value3

カンマ区切りのリストとして:

key=value1,value2,value3

ただし、どちらもResourceBundle#getStringArrayを使用して取得できません。

ResourceBundle#getStringArrayを使用して取得できるように、プロパティファイルでキーと値のペアのセットをどのように表現しますか?

29
Grant Wagner

Propertiesオブジェクトは、Objectsだけでなく、Stringsを保持できます。それらは.propertiesファイルをロードするために圧倒的に使用されるため、忘れられる傾向があり、多くの場合、Stringsのみが含まれます。 ドキュメント は、bundle.getStringArray(key)の呼び出しが_(String[]) bundle.getObject(key)_の呼び出しと同等であることを示します。それが問題です:値は_String[]_ではなく、Stringです。

カンマ区切り形式で保存し、値に対してsplit()を呼び出すことをお勧めします。

32

Commons Configuration を使用できます。これには、コンマ区切りの文字列のリストを取得できるメソッドgetListおよびgetStringArrayがあります。

7
João Silva

うーん、これはスレッド here および here からの一般的な問題であるように見えます。

メソッドを使用せずに配列の値を自分で解析するか、独自のResourceBundle実装を記述して自分で実行するようです:(。これにはApacheコモンズプロジェクトがあるかもしれません...

JDKソースコードから、PropertyResourceBundleはそれをサポートしていないようです。

4
Chris Kimpton

例:

[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

スプリングを使用するだけ- Spring .properties file:get element as a Array

関連コード:

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

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

プロパティファイルから読み込まれたResourceBundlesでこれが可能であるとは思いません。 PropertyResourceBundleは、Propertiesクラスを利用してプロパティファイルをロードします。 Propertiesクラスは、プロパティファイルをString-> Stringマップエントリのセットとしてロードし、String []値のプルをサポートしていません。

ResourceBundle.getStringArrayを呼び出すと、ResourceBundle.getObjectが呼び出され、結果がString []にキャストされます。 PropertyResourceBundleはこれをファイルからロードしたPropertiesインスタンスに渡すだけなので、これを現在のストックPropertyResourceBundleで動作させることはできません。

1
Alan Krueger
key=value1;value2;value3

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

私はこれを試しました、そして方法を見つけることができました。 1つの方法は、ListresourceBundleのサブクラスを定義してから、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