これは必ずしも簡単ではありません。
clearCache()
を介してResourceBundle
をクリアするだけでは、必ずしも望ましい結果が得られるわけではありません。
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
しかしこれはまだfaces-config.xmlファイルで定義されたリソースバンドルを再ロードしません。多くの場合、あなたは、少なくとも、コンテキストクラスローダを使用してクリアしてみてください必要があります。少なくともMojarra JSF 1.2の実装は、リソースバンドルを内部的に内部的にキャッシュします。これは、中に起こる:
FacesContext -> Application -> associate (ApplicationAssociate) -> resourceBundles (Map<String, ApplicationResourceBundle>()) -> resources (Map<Locale, ResourceBundle>)
それは(一日の終わりに、それは地図でちょうどエントリです)反射を経て、このキャッシュをクリアすることができます、またはあなたがアプリケーションを交換したいかもしれません。どちらもあなたが普通に気楽にやることではありません。
純粋に開発のために、すでにMojarraについての知識を持っているJRebelを使用することができ、おそらく上記のリフレクショントリックを行う可能性があります。
いくつかの実験の後、私はJBoss AS 5/JSF 1.2のトリックを行う次のコードに行きました。あなたのコードをMojarra(サンパッケージをインポート)に結びつけ、リフレクショントリックが使用されているため、アップグレードすると破損する可能性があります。しかし、いずれにせよ、これはコードです:
public static void reloadBundle() {
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
ApplicationResourceBundle appBundle = ApplicationAssociate.getCurrentInstance().getResourceBundles().get("your_bundle_name");
Map<Locale, ResourceBundle> resources = getFieldValue(appBundle, "resources");
resources.clear();
}
@SuppressWarnings("unchecked")
private static <T> T getFieldValue(Object object, String fieldName) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return (T) field.get(object);
} catch (Exception e) {
return null;
}
}
(必要に応じてutilのあなた自身の好みの反射でgetFieldValueヘルパーメソッドを交換し、適切な例外とヌルハンドラを振りかける)は
これはどのように正確に役立ちますか? –
うまく動作します。ありがとう:) – marioosh
f:loadBundleを使用する代わりにfaces-config.xmlで定義されたメッセージバンドルがあるときに、リロードが機能しないことに気づきました。誰も知っている理由は? – marioosh