2

2 つのプロパティ ファイルがありますが、何か問題があります。inputStream は常に null ですか?

<application>
    <resource-bundle>
        <base-name>resources/Bundle</base-name>
        <var>bundle</var>
    </resource-bundle>
    <locale-config>
        <default-locale>fi</default-locale>
        <supported-locale>fi</supported-locale>

    </locale-config>

    <resource-bundle>
        <base-name>resources/avainsanat</base-name>
        <var>avainsanat</var>
    </resource-bundle>
</application>

 public static List getAvainsanat() throws IOException {
    InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("avainsanat.properties");

    Properties properties = new Properties();
    List<String> values = new ArrayList<>();
    System.out.println("InputStream is: " + input);

    for (String key : properties.stringPropertyNames()) {
        String value = properties.getProperty(key);
        values.add(value);

    }
    return values;
}

faces-config に 2 つ以上のプロパティ ファイルを含めることさえ可能ですか? そうでない場合、キーにプレフィックス key_ が付いているプロパティのみをバンドルから読み取るにはどうすればよいですか?

ありがとうサミ

4

1 に答える 1

5

resourcesパスにパッケージを含めるのを忘れました。コンテキストクラスローダーは、常にクラスパスルートを基準にして検索します。

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("resources/avainsanat.properties");

より正しい方法は、この特定の場合ですが、を使用ResourceBundle#getBundle()することです。これは、JSFが次の目的で使用しているものでもあります<resource-bundle>

ResourceBundle bundle = ResourceBundle.getBundle("resources.avainsanat", FacesContext.getCurrentInstance().getViewRoot().getLocale());
// ...

(実際にはを使用する必要があることに注意してください<base-name>resources.avainsanat</base-name>

または、Beanがリクエストスコープの場合は、#{avainsanat}管理プロパティとして注入することもできます。

@ManagedProperty("#{avainsanat}")
private ResourceBundle bundle;

または、プログラムで評価するには:

FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().evaluateExpressionGet(context, "#{avainsanat}", ResourceBundle.class);
// ...
于 2012-11-07T13:34:23.750 に答える