web-dev-qa-db-ja.com

マネージドBean内からメッセージバンドル文字列を取得するにはどうすればよいですか?

JSF 2マネージドBean内からメッセージバンドルから文字列を取得できるようにしたいと思います。これは、文字列がFacesMessageの要約または詳細パラメーターとして、またはスローされた例外のメッセージとして使用される状況で行われます。

マネージドBeanがユーザーのロケールに適したメッセージバンドルをロードすることを確認したい。 JSF API呼び出しを使用してマネージドBeanからこれを行う方法は明確ではありません。

私の構成は次のとおりです。

  • コンテナーとしてTomcat 7を使用して、ソリューションが完全なアプリケーションサーバーコンテナーでのみ機能するAPI呼び出しに依存できないようにする
  • JSF 2リファレンス実装の使用(Mojarra)
  • CDIを許可するライブラリを使用しない

注:この同様の質問 を見ましたが、それは私の構成では利用できない機能に依存します

EDIT:元の質問を間違えました。私が尋ねたのは、「マネージドBean内からresourceバンドル文字列をどのように取得できますか?」でした。 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);
}

また、「メッセージ」バンドルと「リソース」バンドルの違いを説明する 別の質問 へのリンクもあります。

30
Jim Tough

Application#getMessageBundle()<message-bundle>の完全修飾バンドル名を取得できます。 UIViewRoot#getLocale() で現在のロケールを取得できます。 ResourceBundle#getBundle() により、完全修飾バンドル名とロケールからResourceBundleを取得できます。

だから、要約:

FacesContext facesContext = FacesContext.getCurrentInstance();
String messageBundleName = facesContext.getApplication().getMessageBundle();
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(messageBundleName, locale);
// ...

Update:質問の間違いにより、<base-name><resource-bundle>で識別されるバンドルを実際に取得する必要があります。残念ながら、これは標準のJSF APIから直接利用することはできません。コード内で同じベース名をハードコーディングして、上記の例のmessageBundleNameをそれに置き換えるか、要求スコープBeanの<var>の管理プロパティとして注入する必要があります。

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
50
BalusC
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");

ここでキーはプロパティファイルからアクセスするプロパティ名です。

       message = This is "message"

このエントリは、messages.properitesファイルからのものです。 「メッセージ」は「キー」です。

24
keiler

マネージドBeanでStringリソースバンドルを取得するには、baseNameまたはvarNameを使用する2つの方法があります(以下の各定義を参照)。

VarNameを使用:

varName<var></var><resource-bundle>を表す文字列

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

BaseNameを使用:

baseName:リソースバンドルの完全修飾名(<base-name><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");
5
Tarik