31

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);
}

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

4

3 に答える 3

53

の完全修飾バンドル名を取得でき<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);
// ...

更新<base-name>:質問の間違いによると、実際にはof で識別されるバンドルを取得したいと考えています<resource-bundle>。残念ながら、これは標準の JSF API から直接利用することはできません。コード内で同じベース名をハードコーディングmessageBundleNameして上記の例<var>

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
于 2011-06-08T00:13:31.843 に答える
27
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");

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

       message = This is "message"

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

于 2011-08-02T17:08:34.793 に答える
6

マネージド Bean で String リソース バンドルを取得するには、baseNameorを使用して 2 つの方法がありますvarName(以下のそれぞれの定義を参照してください)。

varName の使用:

varName<var></var>: in を表す文字列です。<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");
于 2015-02-10T14:04:44.673 に答える