まず、アプローチの varName/baseName を混同しました。実際のアプローチは次のとおりです。
Application#getResourceBundle()
varName
<resource-bundle><var>
: in を表す文字列です。faces-config.xml
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
ResourceBundle bundle = application.getResourceBundle(context, varName);
ResourceBundle#getBundle()
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);
前者は JSF を介して取得しますが、これは内部で( へのフォールバックを使用して)Application
も使用しますが、後者は直接取得します。UIViewRoot#getLocale()
Locale#getDefault()
技術と最終結果に関しては、違いはありません。どちらの場合でもまったく同じバンドルを取得できます (ロケールが正しい場合)。ただ、メンテナンス性に関しては、断然違います。リソース バンドルは「構成」に分類され、( で) 外部化する必要がありますfaces-config.xml
。
のように FQN をハードコーディングすることは、お勧めできませんbaseName
。すべてのコードを再コンパイルして再構築しなければ、FQN を簡単にすばやく変更することはできません。サードパーティの JAR ファイルに含まれていた場合は、さらに面倒です。それ以外の場合は、webapp 内から別<resource-bundle>
の同じものでオーバーライドすることができます。<var>
また、JSF コンポーネント/ユーティリティ ライブラリは独自のApplication
ラッパーを提供する場合がありgetResourceBundle()
ます。経由で直接取得した場合、それは不可能ですResourceBundle#getBundle()
。
ちなみに、3 番目のアプローチがあります。注入するだけです。
JSF マネージド Bean で、以下を提供<var>text</var>
:
@ManagedProperty("#{text}")
private ResourceBundle text;
または、CDI マネージド Bean で:
@Inject
private PropertyResourceBundle text;
このプロデューサーでは:
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
}
}
注:#{text}
バンドルの EL 評価はカバーの下で使用されますApplication#getResourceBundle()
。