gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:09:59 25 4
gpt4 key购买 nike

我们在 JDK1.6 和 Tomcat6.1 中使用 JSF2.0

我们需要在不重启服务器的情况下更新属性文件值(由 JSF 资源包加载),这样实时网络 session 就不会停止。

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

我错过了什么吗?

最佳答案

这曾经用于某些 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 方法来实现相同的目的。

关于java - JSF2.0 ResourceBundle需要在不重启服务器的情况下重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5490192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com