在Java中,如何在web应用程序中动态重新加载资源包?

在Java中,如何在web应用程序中动态重新加载资源包?,java,resources,resourcebundle,Java,Resources,Resourcebundle,我们使用fmt:setBundle从数据库加载资源包(我们扩展了ResourceBundle类来实现这一点)。 当我们修改数据库中的值时,我们必须重新加载web服务器以在web应用程序上显示新值 有没有简单的方法可以在不重新启动web服务器的情况下使用新值 (我们不希望总是从数据库中查找值,但我们希望使缓存无效,例如通过调用特殊的“admin”URL) 编辑:我们使用的是JDK1.4,所以我更喜欢该版本的解决方案。:) 如果您使用的是JDK 1.6,则可以在中使用回调方法getTimeOlive

我们使用fmt:setBundle从数据库加载资源包(我们扩展了ResourceBundle类来实现这一点)。 当我们修改数据库中的值时,我们必须重新加载web服务器以在web应用程序上显示新值

有没有简单的方法可以在不重新启动web服务器的情况下使用新值

(我们不希望总是从数据库中查找值,但我们希望使缓存无效,例如通过调用特殊的“admin”URL)


编辑:我们使用的是JDK1.4,所以我更喜欢该版本的解决方案。:)

如果您使用的是JDK 1.6,则可以在中使用回调方法
getTimeOlive()
needsReload()
来控制是否需要使用数据库中的新值加载捆绑缓存

正如其他人在评论中指出的那样,您可能需要研究Spring—特别是。

首先,您可以创建一个从
ReloadableResourceBundleMessageSource
扩展的类,以公开其名为
getProperties
的内部类保护方法。此方法从
属性文件夹
对象返回并发映射。其次,应该在web配置类中配置该扩展类的bean。现在,您可以在服务或业务层中使用messageSource。这里是参考链接

如果您不太喜欢ResourceBundle类本身,那么Spring的MessageSource抽象提供了一种更灵活的方法,包括缓存和重新加载消息。它可以包装您的定制ResourceBundle。如果需要的话,您可以单独使用SpringAPI的这一部分。答案可能是特定于您正在使用的Servlet容器(应用服务器),例如Tomcat或JBoss。哪一个?我们正在使用Tomcat开发Websphere Application Server for production(5.X)。您应该在回答中提供至少部分lin作为解释。请单击给定的链接,我希望能得到足够的解释。@ilkerkaran我编辑了我的回答并添加了一个简短的解释。