2

我有两个属性文件,但是出了点问题,inputStream 总是为空?

<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 中有两个或多个属性文件?如果没有,我如何才能从我的包中只读取那些键具有前缀 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());
// ...

(请注意,您实际上应该使用 a <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 回答