重新加载使用setBundle加载的属性文件

gok*_*ine 6 java spring jstl resourcebundle

我希望在Spring中涉及属性文件的问题有一点帮助.所以我的设置是这样的:

opto-mapping.properties - 它位于我的src文件夹中,包含我优化资源的翻译,如下所示:

generic-min.css=4037119659.css
Run Code Online (Sandbox Code Playgroud)

每次运行构建"优化"时,都会更新此属性文件.然后我用

<fmt:setBundle basename="opto-mapping" />
Run Code Online (Sandbox Code Playgroud)

在我想要的jsp中导入我的属性文件.然后使用以下内容引用内容:

<fmt:message key='generic-min.css' />
Run Code Online (Sandbox Code Playgroud)

除了属性文件需要重新加载tomcat重启之外,这一切都很好用.我不希望每次更新资源时都要开始关闭网站.我希望属性文件每隔一段时间自动重新加载一次.

我没有试图更新我的弹簧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>
Run Code Online (Sandbox Code Playgroud)

任何帮助或在正确的方向点会在这个艰难的时刻将不胜感激.

我希望所有这些都能提前做好准备,并提前多多感谢!

G.

gok*_*ine 5

谢谢你们的回复.我现在有了这个工作,并认为我会分享财富.

所以,我将我的属性文件从src文件夹移到WEB-INF/properties中.

我更新了以下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>
Run Code Online (Sandbox Code Playgroud)

现在,我之前使用setBundle加载到我的属性文件中,如下所示:

<fmt:setBundle basename="opto-mapping" />
Run Code Online (Sandbox Code Playgroud)

但我发现显然我的属性文件不再被加载,因为我已经移动了它.但由于我的bean设置,正在加载新的属性文件,但我的setBundle正在覆盖它.

所以,解决方案是删除setBundle,现在我的属性文件正在重新加载!

再次感谢!


ksc*_*eid 1

您可以尝试一些事情。

<fmt:setBundle>最终会调用ResourceBundle.getBundle(String, Locale, 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);
Run Code Online (Sandbox Code Playgroud)

然后你就可以<fmt:message>在你的页面中使用。您可以在JSTL APILocalizationContext中找到 JSTL API 的文档。Config

许多其他变体也是可能的,但请务必查看 JDK 1.6 中较新的ResourceBundle(包括ResourceBundle.Control)添加内容,记住“较低级别”API(例如 )的功能URLConnection,并熟悉可用的 JSTL 的更多编程方面通过它的 API。