2011-05-12 15 views
5

Estoy utilizando spring mvc v3 con vistas de freemarker y no puedo deshabilitar el almacenamiento en caché. Intenté estableciendo el caché en falso en el elemento ViewResolver en (spring-servlet.xml) pero no funcionó.Cómo deshabilitar el almacenamiento en caché de freemarker en Spring MVC

Básicamente lo que me gustaría hacer los cambios en FreeMarker y ver estos cambios en el navegador con refresco solamente (w/o reiniciar la aplicación)

¿Alguna pista de cómo hacerlo?

Respuesta

1

Marcó el FreeMarker documentation, que contiene algunos consejos sobre cómo influir en el almacenamiento en caché de plantillas en el nivel FreeMarker Configuration. No estoy seguro de si tiene acceso al objeto FreeMarker Configuration desde Spring MVC, pero si lo ha hecho, la página de documentación mencionada anteriormente podría indicarle una posible solución.

0

Tuve el mismo problema que pude resolver solo mediante la implementación de un cargador de plantillas personalizado. Aquí está el código de trabajo:

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(); 
    } 
} 
0

Parece que en la versión 2.3.17 FreeMarker publicado recientemente, una forma legal y más simple de hacerlo ha aparecido: freemarker.cache.NullCacheStorage.

+1

¿Algún ejemplo sobre cómo configurar NullCacheStorage usando solo configuración? –

3

En mi XML la siguiente fue un éxito:

<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> 

Este es mi correo config, pero el freemarkerConfig debe ser interesante que cuatro, también.

2

Según lo definido por la manual:

Si cambia el archivo de plantilla, a continuación, FreeMarker volverá a la carga y re-analizar la plantilla automáticamente cuando se obtiene la plantilla de la próxima tiempo. Sin embargo, desde que se comprueba si el archivo se ha modificado puede consumir el tiempo , existe una configuración de nivel de configuración llamada `` update delay ''. Este es el tiempo que debe transcurrir desde la última comprobación de una versión más reciente de una determinada plantilla antes de que FreeMarker verifique de nuevo. Esto está configurado en 5 segundos por defecto. Si desea ver los cambios de las plantillas de inmediato, lo puso a 0.

Después de buscar en todo, la clave de configuración estaba en el freemarker.template.Configuration javadocs, at the setSetting(key, value) method. Así que, en resumen, simplemente configure la configuración template_update_delay en para la detección inmediata de cambios.

<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> 
+0

el nombre de la propiedad es 'templateLoaderPaths', se pierde' s'. ¿La primavera lo convierte en 'templateLoaderPaths' inteligentemente? – hiway

+0

Tiene tanto templateLoaderPath como templateLoaderPaths. Ver http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.html#setTemplateLoaderPath-java.lang.String- – bertie

1

Perdí los últimos dos días (nótese por completo para este proyecto) tratando de deshabilitar el caché. Resulta que tengo las dos opciones antiJARLocking y antiResourceLocking en mi context.xml. Entonces, las plantillas SIEMPRE se almacenarán en caché

1

No uso para configurar freemarker con xml configuraciones pero con @Configuration clases anotadas; porque prefiero el estilo Spring-Boot'.Así puede desactivar la caché freemarker's así:

@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; 
} 

La clave está en:

config.setCacheStorage (nueva NullCacheStorage());

Pero también se puede utilizar esta instrucción en su lugar:

config.setTemplateUpdateDelayMilliseconds(0); 

Se debe trabajar para usted.

Cuestiones relacionadas