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