Freemarker 不加载远程模板

Freemarker not loading remote template

我正在使用 Spring MVC 和 freemarker 作为我的视图解析器,(这并不重要)我有多个这样定义的模板加载器:

    <bean id="urlTemplateLoader" class="com.URLTemplateLoader">
        <property name="baseUrl" value="http://xxxx:8080/ftl/"/>
    </bean>

    <bean id="defaultTemplateLoader" class="com.WebappTemplateLoader">
        <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> 
    </bean>

    <bean id="multiTemplateLoader" class="freemarker.cache.MultiTemplateLoader">
        <constructor-arg>
          <list>
            <ref bean="urlTemplateLoader"/>   
            <ref bean="defaultTemplateLoader"/> 
          </list>
        </constructor-arg>
    </bean>

这是为了先检查CMS服务器,然后使用本地文件。视图解析器定义如下:

    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="preTemplateLoaders" ref="multiTemplateLoader"/>  
        <property name="freemarkerSettings">
            <props>
                <prop key="default_encoding">UTF-8</prop>
                <prop key="localized_lookup">false</prop>
                <prop key="date_format">yyyy-MM-dd</prop>
                <prop key="template_update_delay">0</prop>
            </props>
        </property>  
    </bean>

现在的问题是,如果文件在第一次查找时不在远程服务器上,它将永远不会再次检查,直到服务器重新启动。我将 template_update_delay 设置为 0,所以一旦它存在,每当我更新它时,它都会自动拉出新的,这很好,但如果它不存在,我如何让它再次检查首先?

正如 MultiTemplateLoader 的 JavaDoc 所说:

On every request, loaders are queried in the order of their appearance in the array of loaders provided to the constructor. However, if a request for some template name was already satisfied in the past by one of the loaders, that Loader is queried first (a soft affinity).

我会在2.3.24(预计3月初)给它加一个sticky 属性(其中enables/disables "soft affinity"),但是我不能更改其默认值直到 3.0.0 或类似的东西。同时,您可以在自定义 TemplateLoader 中执行此操作(复制粘贴 MultiTemplateLoader 的源代码,然后从中删除关联部分……应该很容易)。