Jim*_*ugh 30 jsf jsf-2 managed-bean message-bundle
我希望能够从JSF 2托管bean内部的消息包中检索字符串.这可以在将字符串用作FacesMessage抛出异常中的消息中的摘要或详细信息参数的情况下完成.
我想确保托管bean为用户的语言环境加载正确的消息包.我不清楚如何使用JSF API调用从托管bean执行此操作.
我的配置是:
注意:我确实看到了类似的问题,但这取决于我的配置中不可用的功能
编辑:我在原来的问题上犯了一个错误.我想要问的是"如何从托管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)
小智 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文件.而"消息"是"关键".
有两种方法可以在托管bean中获取String资源包,使用baseName或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:资源包的完全限定名称(<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)
| 归档时间: |
|
| 查看次数: |
63242 次 |
| 最近记录: |