31

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

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

我的配置是:

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

注意:我确实看到了这个类似的问题,但这取决于我的配置中不可用的功能

编辑:我在原来的问题中犯了一个错误。我的意思是“如何从托管 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);
}

此外,这里是另一个问题的链接,该问题解释了“消息”包和“资源”包之间的区别。

4

3 回答 3

53

您可以获得<message-bundle>by的完整限定包名称Application#getMessageBundle()。您可以通过 获取当前语言环境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>of标识的捆绑包<resource-bundle>。不幸的是,标准的 JSF API 不能直接使用它。您可以在代码中硬编码相同的基本名称并messageBundleName用它替换上面示例中的名称,或者将其作为托管属性注入到<var>请求范围的 bean 中:

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
于 2011-06-08T00:13:31.843 回答
27
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");

这里的关键是您要从属性文件访问的属性名称。

       message = This is "message"

此条目来自 messages.properites 文件。“消息”是“关键”。

于 2011-08-02T17:08:34.793 回答
6

有两种方法可以在托管 bean 中获取 String 资源包,使用baseNameor varName(参见下面每个定义):

使用变量名:

varName: 是代表<var></var>in的字符串<resource-bundle>

FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, varName);
String msg = bundle.getString("key");

使用基本名称:

baseName: 资源包的完全限定名称 ( <base-name>in <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");
于 2015-02-10T14:04:44.673 回答