簡體   English   中英

如何從托管 bean 中獲取消息包字符串?

[英]How can I get a message bundle string from inside a managed bean?

我希望能夠從 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);
}

此外,這里是另一個問題的鏈接,該問題解釋了“消息”包和“資源”包之間的區別。

您可以通過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 資源包,使用baseNamevarName (請參閱下面的每個定義):

使用變量名:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM