使用setBundle加载的属性文件的重新加载
-
30-09-2019 - |
题
我希望在春季涉及属性文件的问题上有一点帮助。所以我拥有的设置就是这样:
opto-mapping.properties - 它位于我的SRC文件夹中,并包含我的优化资源的翻译:
generic-min.css=4037119659.css
每次运行“优化”构建时,都会更新此Popories文件。然后我使用
<fmt:setBundle basename="opto-mapping" />
在所需的JSP中导入我的属性文件。然后通过使用:
<fmt:message key='generic-min.css' />
这一切都可以很好地工作,除了属性文件需要重新加载的tomcat重新启动。我不想每次更新资源时都必须开始降低网站。我希望属性文件可以自动重新加载。
我确实尝试在spring -context.xml中更新现有的bean,以像翻译一样重新加载此属性文件,但这却没有起作用 - 由于opto -mapping.properties文件位置,因此很可能会发现它需要在该位置使用FMT:SetBundle加载。
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="cacheSeconds">
<value>1</value>
</property>
<property name="basenames">
<list>
<value>WEB-INF/translations/translations</value>
<value>WEB-INF/classes/opto-mapping</value>
</list>
</property>
</bean>
在这个困难时期,任何帮助或正确方向的点都将不胜感激。
我希望这一切能使Senese和事先感谢!
G。
解决方案
您可能会尝试一些事情。
<fmt:setBundle>
最终会打电话 ResourceBundle.getBundle(String, Locale, ClassLoader)
, ,弦将是您的basename,classloader将是 Thread.currentThread().getContextClassLoader()
. 。如果您使用的是JDK 1.6,则可以尝试使用 ResourceBundle.clearCache(ClassLoader)
清除捆绑缓存。在Servlet过滤器中进行此操作并将其与其他一些逻辑结合起来是有意义的,以确定应何时清除缓存。
另一个角度是对属性文件的加载和JSTL的配置进行更直接的控制。同样,使用过滤器(忽略异常处理):
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);
那你只能使用 <fmt:message>
在您的页面中。您可以找到文档 LocalizationContext
和 Config
在里面 JSTL API.
许多其他变化是可能的,但请确保查看更新的 ResourceBundle
(包含 ResourceBundle.Control
)添加JDK 1.6,请记住“低级” API的功能 URLConnection
, ,并熟悉通过其API获得的JSTL的更程序化方面。
其他提示
谢谢你们的回答。我现在已经有了这个工作,并认为我会分享财富。
因此,我将属性文件从SRC文件夹中移出,并将其移至Web-Inf/属性中。
我更新了以下bean来加载属性文件:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="cacheSeconds">
<value>1</value>
</property>
<property name="basenames">
<list>
<value>WEB-INF/translations/translations</value>
<value>WEB-INF/properties/opto-mapping</value>
</list>
</property>
</bean>
现在,以前我使用setBundle将其加载到我的属性文件中:
<fmt:setBundle basename="opto-mapping" />
但是我发现显然我的属性文件不再加载了,因为我已经移动了它。但是由于我的bean设置,正在加载新属性文件,但我的setBundle掩盖了这一点。
因此,解决方案是删除setBundle,现在我的属性文件正在重新加载!
再次感谢!
Tomcat将不会重新加载班级路径上的资源。这在 Javadoc 为了 ReloadableResourceBundleMessageSource
:
由于应用程序服务器通常会缓存从ClassPath加载的所有文件,因此有必要将资源存储在其他地方(例如,在Web应用程序的“ Web-Inf”目录中)。否则,类路径中文件的更改将不会反映在应用程序中。
这样的班级路径包括 WEB-INF/classes
, ,并且不会被释放。
尝试移动 opto-mapping.properties
在其他地方(例如 WEB-INF/messages
),然后尝试。