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
的源代码,然后从中删除关联部分……应该很容易)。
我正在使用 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
的源代码,然后从中删除关联部分……应该很容易)。