Как отключить кеширование freemarker в Spring MVC - PullRequest
5 голосов
/ 12 мая 2011

Я использую spring mvc v3 с представлениями freemarker и не могу отключить кэширование. Я попытался установить для кэша значение false в элементе viewResolver в (spring-servlet.xml), но это не сработало.

В основном я хотел бы сделать некоторые изменения в freemarker и увидеть эти изменения в браузере только с обновлением (без перезапуска приложения)

Любые советы, как это сделать?

Ответы [ 8 ]

4 голосов
/ 12 июля 2012

В моем XML следующее было успешным:

<bean id="freemarkerMailConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPaths" value="classpath:emailtemplates/task,classpath:emailtemplates/user"/>
    <!-- Activate the following to disable template caching -->
    <property name="freemarkerSettings" value="cache_storage=freemarker.cache.NullCacheStorage" />
</bean>

Это мой почтовый конфиг, но freemarkerConfig должен быть интересен и вам четырем.

2 голосов
/ 02 августа 2018

В приложении. Свойства:

1002 *
2 голосов
/ 09 сентября 2015

Я не использую для настройки freemarker с xml конфигурациями, но с @Configuration аннотированными классами; потому что я предпочитаю стиль Spring-Boot´. Таким образом, вы можете отключить кеш freemarker следующим образом:

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException
{
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer()
    {

        @Override
        protected void postProcessConfiguration(freemarker.template.Configuration config) throws IOException, TemplateException
        { 
            ClassTemplateLoader classTplLoader = new ClassTemplateLoader(context.getClassLoader(), "/templates"); 
            ClassTemplateLoader baseMvcTplLoader = new ClassTemplateLoader(FreeMarkerConfigurer.class, ""); //TODO tratar de acceder a spring.ftl de forma directa
            MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[]
            { 
                classTplLoader,
                baseMvcTplLoader
            });
            config.setTemplateLoader(mtl);
            config.setCacheStorage(new NullCacheStorage()); 
        }
    };
    configurer.setDefaultEncoding("UTF-8"); 
    configurer.setPreferFileSystemAccess(false);
    return configurer;
}

Ключ находится в:

config.setCacheStorage (new NullCacheStorage ());

Но вы также можете использовать эту инструкцию вместо:

config.setTemplateUpdateDelayMilliseconds(0);

Это должно сработать для вас.

2 голосов
/ 08 марта 2013

Как определено в руководстве :

Если вы измените файл шаблона, FreeMarker перезагрузится и повторно проанализировать шаблон автоматически, когда вы получите следующий шаблон время. Однако, так как проверка, был ли файл изменен, может быть временем потребляет, есть настройка уровня конфигурации, называемая `` update Задержка «». Это время, которое должно пройти с момента последней проверки более новая версия определенного шаблона, прежде чем FreeMarker проверит Это снова. По умолчанию установлено значение 5 секунд. Если вы хотите увидеть изменения шаблонов немедленно, установите его на 0.

После поиска, конфигурационный ключ находился в javadocs freemarker.template.Configuration, в методе setSetting (key, value) . Итак, вкратце, просто установите config template_update_delay на 0 для немедленного обнаружения изменений.

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
  <property name="freemarkerSettings">
        <props>
            <prop key="template_update_delay">0</prop>
            <prop key="default_encoding">UTF-8</prop>
        </props>
  </property>
</bean>
1 голос
/ 30 октября 2013

Последние два дня я потратил впустую (обратите внимание полностью на этот проект), пытаясь отключить кеш. Оказывается, у меня есть два параметра antiJARLocking и antiResourceLocking в моем context.xml. Тогда шаблоны ВСЕГДА будут кэшироваться

1 голос
/ 16 мая 2011

Проверяли ли вы документацию FreeMarker , в которой содержатся некоторые советы о том, как повлиять на кэширование шаблонов на уровне FreeMarker Configuration.Я не уверен, что у вас есть доступ к объекту FreeMarker Configuration из Spring MVC, но если у вас есть, то упомянутая выше страница документации может указать вам на возможное решение.

0 голосов
/ 20 июня 2011

Похоже, что в недавно выпущенной версии 2.3.17 FreeMarker появился легальный и простой способ сделать это: freemarker.cache.NullCacheStorage.

0 голосов
/ 20 июня 2011

У меня была та же проблема, которую я мог решить, только внедрив собственный загрузчик шаблонов.Вот рабочий код:

protected void init() throws Exception {
    freemarkerConfig = new Configuration();
    freemarkerConfig.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);
    freemarkerConfig.setTemplateLoader(new CacheAgnosticTemplateLoader(new DefaultResourceLoader(), pdfTemplatePath));
}

protected static class CacheAgnosticTemplateLoader extends SpringTemplateLoader {
    public CacheAgnosticTemplateLoader(ResourceLoader resourceLoader, String templateLoaderPath) {
        super(resourceLoader, templateLoaderPath);
    }

    @Override
    public long getLastModified(Object templateSource) {
        // disabling template caching
        return new Date().getTime();
    }
}
...