我们正在使用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();
我错过了什么吗?
答案 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方法来实现相同的目标。