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

Jim*_*ugh 30 jsf jsf-2 managed-bean message-bundle

我希望能够从JSF 2托管bean内部的消息包中检索字符串.这可以在将字符串用作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);
}
Run Code Online (Sandbox Code Playgroud)

此外,这里还有一个链接到另一个问题,解释了"消息"包和"资源"包之间的区别.

Bal*_*usC 50

你可以得到的完全限定包名称<message-bundle>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);
// ...
Run Code Online (Sandbox Code Playgroud)

更新:根据问题中的错误,你真正想要得到它是由确定的捆绑<base-name><resource-bundle>.遗憾的是,标准JSF API无法直接使用它.您要么在代码中对相同的基本名称进行硬编码,并用messageBundleName上面的示例替换它,要么将其作为托管属性注入<var>到请求范围的bean中:

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
Run Code Online (Sandbox Code Playgroud)

  • 后一种解决方案不起作用.它报告bundle的NullPointerException. (2认同)

小智 24

FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");
Run Code Online (Sandbox Code Playgroud)

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

       message = This is "message"
Run Code Online (Sandbox Code Playgroud)

此条目来自messages.properites文件.而"消息"是"关键".


Tar*_*rik 5

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

使用varName:

varName:是表示<var></var>in 的String<resource-bundle>

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

使用baseName:

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");
Run Code Online (Sandbox Code Playgroud)