我希望在春季涉及属性文件的问题上有一点帮助。所以我拥有的设置就是这样:

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> 在您的页面中。您可以找到文档 LocalizationContextConfig 在里面 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),然后尝试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top