需要在不重启服务器的情况下重新加载JSF2.0 ResourceBundle

时间:2011-03-30 17:57:24

标签: java tomcat jsf-2 resourcebundle

我们正在使用JSF2.0和JDK1.6以及Tomcat6.1

我们需要更新属性文件值(由JSF资源包加载),而无需重新启动服务器,以便不会停止实时Web会话。

是否可以使用JDK1.6,我尝试了以下clearCache代码,但它没有用。

ResourceBundle bundle = ResourceBundle.getBundle("Label");
String s = bundle.getString("profile.firstName");
out.println("Value before: %"+ s);
ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
bundle = ResourceBundle.getBundle("Label");
s = bundle.getString("profile.firstName");
out.println("Value after: {}"+s);

之前有没有人尝试过。

更新

以下似乎无法解决重新加载资源包的问题

ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());
ApplicationResourceBundle applicationBundle = ApplicationAssociate.getCurrentInstance().getResourceBundles().get("Label");
Field field = applicationBundle.getClass().getDeclaredField("resources");
field.setAccessible(true);
Map<Locale, ResourceBundle> resources = (Map<Locale, ResourceBundle>) field.get(applicationBundle);
resources.clear();

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

这曾经用于某些JSF实现/版本。但是,在最近的Mojarra版本中,缓存机制在实现本身中获得了额外的层。假设你确实使用了Mojarra,除了行

ResourceBundle.clearCache(Thread.currentThread().getContextClassLoader());

您还需要从com.sun.faces.application.ApplicationAssociate

开始执行此操作
ApplicationResourceBundle applicationBundle = ApplicationAssociate.getCurrentInstance().getResourceBundles().get("Label");
Field field = applicationBundle.getClass().getDeclaredField("resources");
field.setAccessible(true);
Map<Locale, ResourceBundle> resources = (Map<Locale, ResourceBundle>) field.get(applicationBundle);
resources.clear();

是的,这是一个黑客,但到目前为止,JSF没有提供任何干净的API方法来实现相同的目标。