重新加载使用setBundle加载的属性文件
我希望在Spring中涉及属性文件的问题有一点帮助。 所以我的设置是这样的:
opto-mapping.properties – 它位于我的src文件夹中,包含我优化资源的翻译,如下所示:
generic-min.css=4037119659.css
每次运行构建“优化”时,都会更新此属性文件。 然后我用
在我想要的jsp中导入我的属性文件。 然后使用以下内容引用内容:
这一切都很好用,除了属性文件需要重新加载tomcat重启。 我不希望每次更新资源时都要开始关闭网站。 我希望属性文件每隔一段时间自动重新加载一次。
我确实尝试更新spring-context.xml中的现有bean来重新加载这个属性文件,就像我对翻译一样,但这没有用 – 很可能是因为opto-mapping.properties文件的位置 – 但你看到它需要使用fmt:setBundle加载到该位置。
1 WEB-INF/translations/translations WEB-INF/classes/opto-mapping
在这个困难时期,任何帮助或正确方向的观点都将受到极大的赞赏。
我希望所有这一切都能提前做好准备,并提前多多感谢!
G。
你可能会尝试一些事情。
最终将调用ResourceBundle.getBundle(String, Locale, ClassLoader)
,其中字符串将是您的基本名称,类加载器将是Thread.currentThread().getContextClassLoader()
。 如果您使用的是JDK 1.6,则可以尝试使用ResourceBundle.clearCache(ClassLoader)
来清除捆绑缓存。 在servletfilter中执行此操作并将其与其他逻辑组合以确定何时应清除缓存是有意义的。
另一个角度是更直接地控制属性文件的加载和JSTL的配置。 再次,使用filter(忽略exception处理):
ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); URL propsURL = ctxLoader.getResource("opto-mapping.properties"); URLConnection propsConn = propsURL.openConnection(); long propsLastModified = propsConn.getLastModified(); // decide if you want to reload... propsConn.setUseCaches(false); InputStream propsIn = propsConn.getInputStream(); ResourceBundle propsBundle = new PropertyResourceBundle(propsIn); propsIn.close(); LocalizationContext propsCtx = new LocalizationContext(propsBundle); ServletContext servletCtx = this.filterConfig.getServletContext(); Config.set(servletCtx, Config.FMT_LOCALIZATION_CONTEXT, propsCtx);
然后,您可以在页面中使用
。 您可以在JSTL API中找到LocalizationContext
和Config
的文档。
许多其他变体是可能的,但请务必查看JDK 1.6中新增的ResourceBundle
(包括ResourceBundle.Control
),记住URLConnection
等“低级”API的function,并熟悉更多JSTL的程序化方面可通过其API获得。
谢谢你们的回复。 我现在有这个工作,并认为我会分享财富。
所以,我将我的属性文件从src文件夹移到了WEB-INF / properties中。
我更新了以下bean来加载属性文件:
1 WEB-INF/translations/translations WEB-INF/properties/opto-mapping
现在,我之前使用setBundle加载到我的属性文件中,如下所示:
但我发现很明显我的属性文件不再被加载,因为我已经移动了它。 但由于我的bean设置,正在加载新的属性文件,但我的setBundle正在覆盖它。
所以,解决方案是删除setBundle,现在我的属性文件正在重新加载!
再次感谢!
Tomcat不会重新加载类路径上的资源。 这在ReloadableResourceBundleMessageSource
的javadoc中说明:
由于应用程序服务器通常会缓存从类路径加载的所有文件,因此有必要将资源存储在其他位置(例如,在Web应用程序的“WEB-INF”目录中)。 否则,类路径中文件的更改将不会反映在应用程序中。
这样的类路径位置包括WEB-INF/classes
,并且不会被释放。
尝试将opto-mapping.properties
移动opto-mapping.properties
其他地方(例如WEB-INF/messages
),然后尝试。