如何将两个属性文件添加到JSF

时间:2012-11-07 13:26:37

标签: java jsf properties

我有两个属性文件,但有些错误,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中有两个或更多属性文件吗?如果没有,我怎样才能从我的包中读取哪些键具有前缀键_?

的属性

由于 萨米

1 个答案:

答案 0 :(得分: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);
// ...