我希望能够从JSF 2托管bean内部的消息包中检索字符串。这可以在将字符串用作FacesMessage
中的摘要或详细信息参数或作为抛出异常中的消息的情况下完成。
我想确保托管bean为用户的语言环境加载正确的消息包。我不清楚如何使用JSF API调用从托管bean中执行此操作。
我的配置是:
注意:我确实看到this similar question,但这取决于我配置中不可用的功能
编辑:我在原始问题中犯了一个错误。我想要问的是“如何从托管bean中获取资源捆绑字符串”? BalusC给了我正确的答案。我实际上要问的解决方案非常相似:
public static String getResourceBundleString(
String resourceBundleName,
String resourceBundleKey)
throws MissingResourceException {
FacesContext facesContext = FacesContext.getCurrentInstance();
ResourceBundle bundle =
facesContext.getApplication().getResourceBundle(
facesContext, resourceBundleName);
return bundle.getString(resourceBundleKey);
}
另外,这里有一个指向another question的链接,解释了“消息”包和“资源”包之间的区别。
答案 0 :(得分:49)
您可以通过Application#getMessageBundle()
获取<message-bundle>
的完整合格包名称。您可以按UIViewRoot#getLocale()
获取当前的区域设置。您可以从完全合格的捆绑包中获得ResourceBundle
ResourceBundle#getBundle()
的名称和区域设置。
所以,总结一下:
FacesContext facesContext = FacesContext.getCurrentInstance();
String messageBundleName = facesContext.getApplication().getMessageBundle();
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(messageBundleName, locale);
// ...
更新:根据问题中的错误,您实际上想要获取由<base-name>
<resource-bundle>
标识的包。遗憾的是,标准JSF API无法直接使用它。您要么在代码中对相同的基本名称进行硬编码,并将上面示例中的messageBundleName
替换为它,要么将其作为托管属性注入请求范围的bean中的<var>
:
@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
答案 1 :(得分:24)
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");
这里的关键是要从属性文件中访问的属性名称。
message = This is "message"
此条目来自messages.properites文件。而“消息”就是“关键”。
答案 2 :(得分:5)
有两种方法可以使用baseName
或varName
在托管bean中获取String资源包(请参阅下面每个的定义):
varName
:是表示<var></var>
<resource-bundle>
的字符串
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, varName);
String msg = bundle.getString("key");
baseName
:资源包的完全限定名称(<base-name>
中的<resource-bundle>
)。
FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context .getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader);
String msg = bundle.getString("key");