JSF 2マネージドBean内からメッセージバンドルから文字列を取得できるようにしたいと思います。これは、文字列がFacesMessage
の要約または詳細パラメーターとして、またはスローされた例外のメッセージとして使用される状況で行われます。
マネージドBeanがユーザーのロケールに適したメッセージバンドルをロードすることを確認したい。 JSF API呼び出しを使用してマネージドBeanからこれを行う方法は明確ではありません。
私の構成は次のとおりです。
注:この同様の質問 を見ましたが、それは私の構成では利用できない機能に依存します
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);
}
また、「メッセージ」バンドルと「リソース」バンドルの違いを説明する 別の質問 へのリンクもあります。
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
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
を使用する2つの方法があります(以下の各定義を参照)。
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
:リソースバンドルの完全修飾名(<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");