1

我们使用 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();

我错过了什么吗?

4

1 回答 1

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();

是的,这是一个 hack,但是 JSF 没有提供任何干净的 API 方法来实现相同的目的。

于 2011-03-30T19:59:35.747 回答