有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

刷新后缓存共享变量的java Freemarker模板

我有一个SpringMVCWeb应用程序,它使用FreeMarker渲染视图,并提出了以下问题

在我的FreeMarker配置中,我声明了一个singletonspringbean作为FreeMarker变量,在我的应用程序中,我提供了动态刷新singletonbean的机制(bean包含从DB检索到的应用程序配置)

现在的问题是,刷新时,以前呈现的FreeMarker模板使用旧版本中的值,但如果我导航到自容器启动以来未呈现的页面,它将使用新值

以下是我的FreeMarker配置的一个片段:

<!-- FreeMarker config -->

<bean id="freemarkerViewConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPaths">
        <array>
            <value>/WEB-INF/freemarker</value>
            <value>classpath:/WEB-INF/freemarker</value>
        </array>
    </property>
    <property name="freemarkerSettings">
        <props>
            <prop key="datetime_format">dd/MM/yyyy</prop>
            <prop key="number_format">#</prop>
            <prop key="whitespace_stripping">true</prop>
            <prop key="auto_import">
                spring.ftl as spring,
                custom-macros.ftl as custom,
            </prop>
        </props>
    </property>
    <property name="freemarkerVariables">
        <map>
            <entry key="xml_escape" value-ref="fmXmlEscape"/>
            <entry key="html_escape" value-ref="fmHtmlEscape"/>
            <entry key="config" value-ref="config"/>
        </map>
    </property>
</bean>

要刷新配置模型,我在控制器类中执行以下操作:

((XmlWebApplicationContext)applicationContext).refresh();

当访问尚未呈现但无法识别已访问页面上的更改的页面时,使用此配置将选择刷新的配置模型

我尝试了以下方法来强制“刷新”变量,但没有成功:

  1. 在控制器中,在刷新上下文后,我清除FreeMarker配置中已自动连接的templateCache:

    freeMarkerConfig。getConfiguration()。clearTemplateCache()

  2. 我还尝试使用FreeMarker设置中的以下属性禁用FreeMarker配置中的模板缓存:

    免费标记。隐藏物空缓存存储

最后,值得指出的是,在调试和查看缓存和配置时,共享变量确实引用了页面使用旧版本呈现的最新配置模型

关于如何解决此问题,有何建议/指导

ps我正在使用SpringV3。1.1.释放并释放标记v2。3.19


共 (1) 个答案

  1. # 1 楼答案

    这不是一个很好的解决方案,但我已经解决了我的问题,但老实说,这更像是一种黑客行为

    我使用以下命令更改了刷新配置的代码,因此只重新创建了配置bean:

    ((DefaultListableBeanFactory) beanFactory).destroySingleton("config");
    

    然后通过删除对配置模型的引用来修改freemarker配置,因为无论我尝试了什么,都无法刷新它。因此,我的问题的解决方案是修改BaseController,应用程序中的每个控制器都会扩展它,并将配置模型作为@ModelAttribute公开,这样所有视图都可以使用它

    正如我所说,这并不能真正解决根本问题,但我已经解决了我的问题,尽管是以一种非正统的方式