[英]How can I get a message bundle string from inside a managed bean?
我希望能夠從 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);
}
此外,這里是另一個問題的鏈接,該問題解釋了“消息”包和“資源”包之間的區別。
您可以通過Application#getMessageBundle()
獲取<message-bundle>
的完整限定包名稱。 您可以通過UIViewRoot#getLocale()
獲取當前語言環境。 您可以通過ResourceBundle
ResourceBundle#getBundle()
從完整的限定包名稱和語言環境中獲取 ResourceBundle。
所以,總結一下:
FacesContext facesContext = FacesContext.getCurrentInstance();
String messageBundleName = facesContext.getApplication().getMessageBundle();
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(messageBundleName, locale);
// ...
更新:根據問題中的錯誤,您實際上想要獲取由<resource-bundle>
的<base-name>
標識的包。 不幸的是,標准 JSF API 不能直接提供此功能。 您可以在代碼中硬編碼相同的基本名稱並用它替換上面示例中的messageBundleName
,或者將其作為托管屬性注入到請求范圍 bean 中的<var>
上:
@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");
這里的關鍵是您要從屬性文件訪問的屬性名稱。
message = This is "message"
此條目來自 messages.properites 文件。 “消息”是“關鍵”。
有兩種方法可以在托管 bean 中獲取 String 資源包,使用baseName
或varName
(請參閱下面的每個定義):
varName
: 是代表<resource-bundle>
中的<var></var>
的字符串
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, varName);
String msg = bundle.getString("key");
baseName
:資源包的完全限定名稱( <resource-bundle>
中的<base-name>
> )。
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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.