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

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

  •  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

うーん、スレッドこちらおよびこちら

このメソッドを使用せずに配列の値を自分で解析するか、独自のResourceBundle実装を作成して自分でそれを行うかのいずれかです。(..このためのApache Commonsプロジェクトがあるかもしれません...

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

例:

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"}                
    };
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top