如何从托管bean中获取消息包字符串?

时间:2011-06-08 00:08:23

标签: jsf jsf-2 managed-bean message-bundle

我希望能够从JSF 2托管bean内部的消息包中检索字符串。这可以在将字符串用作FacesMessage中的摘要或详细信息参数或作为抛出异常中的消息的情况下完成。

我想确保托管bean为用户的语言环境加载正确的消息包。我不清楚如何使用JSF API调用从托管bean中执行此操作。

我的配置是:

  • 使用Tomcat 7作为容器,因此解决方案不能依赖仅在完整应用程序服务器容器中工作的API调用
  • 使用JSF 2参考实现(Mojarra)
  • 不使用任何允许CDI的库

注意:我确实看到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的链接,解释了“消息”包和“资源”包之间的区别。

3 个答案:

答案 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)

有两种方法可以使用baseNamevarName在托管bean中获取String资源包(请参阅下面每个的定义):

使用varName:

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:

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");