当前位置: 首页 > 知识库问答 >
问题:

Apache Velocity禁用模板和资源缓存

周志文
2023-03-14

我有一个Spring Boot应用程序,它公开了一个用于呈现相对简单的velocity模板的API。模板使用#parse来包含几个其他模板,否则会写出从Java层传递给它的一些基本变量。模板位于JAR文件中,因此它们是从类路径加载的。我使用以下每个请求动态创建的velocity engine设置:

    VelocityEngine ve = new VelocityEngine();
    ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
    ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
    ve.setProperty("classpath.resource.loader.cache", "false");
    ve.setProperty("velocity.engine.resource.manager.cache.enabled", "false");
    ve.setProperty("resource.manager.cache.enabled", "false");
    ve.init();

模板的多个部分对于每个请求来说是唯一的(资源用作对简单的Spring MVC控制器的响应),所以我需要禁用模板资源的缓存。我已经按原样尝试了上述配置,并在src/main/resources中的velocity.properties文件中定义了它,但是在重新启动应用程序之前,更改模板或文件不会“生效”。

按照这个文档页面所说的去做似乎没有帮助(实际上,您可以在上面看到它做了什么)。

上面的引擎代码位于Spring组件类中,即使将VelocityEngine内容移动到静态final字段,并且每次只初始化velocity上下文也没有任何帮助。

如何强制Spring/Velocity每次加载模板&包括的资源?

共有1个答案

禹昆
2023-03-14

您只需要classpath.resource.loader.cache配置键。而且由于Velocity中的所有缓存都默认为false,所以您甚至不需要它。

而且,不需要在每次请求时重新初始化VelocityEngine。

我用下面的小测试程序检查了修改时正确重新加载的资源:

import java.io.PrintWriter;
import java.io.Writer;
import java.util.Scanner;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;    

public class Test
{
    public static void main(String args[])
    {
        try
        {
            VelocityEngine ve = new VelocityEngine();
            ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
            ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
            // next line not needed since 'false' is the default
            // ve.setProperty("classpath.resource.loader.cache", "false");
            ve.init();

            VelocityContext context = new VelocityContext();
            Writer writer = new PrintWriter(System.out);
            Scanner scan = new Scanner(System.in);
            while (true)
            {
                System.out.print("> ");
                String str = scan.next();
                context.put("foo", str);
                ve.mergeTemplate("test.vm", "UTF-8", context, writer);
                writer.flush();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

如果它在您的情况下不起作用,尤其是如果您在每个请求时都重新初始化Velocity,那么这肯定是Spring本身的类加载器缓存问题。

因此,您应该查看Spring热交换指南,了解如何禁用缓存。我想一些对Spring有更好了解的人可以给您一个关于如何在这种特殊情况下进行的提示。

 类似资料:
  • 在我的应用程序中,我需要使用硬连线的html模板,我将通过将它们添加到和动态文本模板,我想在运行时存储在s中。 我的代码与此类似: 问题存在于实现ITemplateResolver的中。我试图使用处理字符串模板中给出的示例与thymeleaf 3,但它们似乎不再适用于当前版本的Spring。 如何从s解析模板?我使用SpringBoot2.2

  • 移动设备 我们为移动设备提供了 10 种模版,你可以使用这些模版来规范设计。 Layout Mobile Whiteframe - 2 MB(.ai) 平板设备 我们为平板设备提供了 14 种模版,你可以使用这些模版来规范设计。 Layout Tablet Whiteframe - 3 MB(.ai) 桌面环境 我们为桌面环境提供了 4 种模板,每种都包含 4 个不同屏幕尺寸,你可以使用这些模版来

  • 问题内容: 我注意到,我会不时地对AngularJS应用程序中的模板之一进行更改,并且在运行时该更改将不可见。相反,我将不得不刷新应用程序,如果失败,请转到模板本身的路径并刷新它,以查看此更改。 防止像这样缓存这些模板的最佳方法是什么?理想情况下,我希望在当前使用Angular应用程序的过程中将它们缓存,但是下次我加载页面时,它们将检索最新和最出色的模板,而无需手动刷新。 我在使用ui-route

  • 这是一个常用的资源控制器模板,使用时可以复制直接使用,复制后把相应命名空间,类名改掉就可以用了; <?php // +---------------------------------------------------------------------- // | ThinkCMF [ WE CAN DO IT MORE SIMPLE ] // +-----------------------

  • 有时候,你希望在不会干扰其他工作的情况下临时禁用一个资源。例如, 你可能想要调整服务器上的一个配置文件,经过 Puppet 的不断测试,直到获得你想要的确切设置。 在此期间你不想让 Puppet 覆盖旧版本的配置,为此你可以在资源上设置如下的 noop 元参数: noop => true, 操作步骤 添加如下代码到你的配置清单: file { "/tmp/test.cfg": conte

  • 以下模板部署: https://gist.github.com/rnkhouse/aea0a8fd395da37b19466348b919d620 错误: “部署失败,状态代码为400,消息:部署模板验证失败:'模板中未定义资源'Microsoft.Network/virtualNetworks/mtes dev VNET'。请参阅。”https://aka.ms/arm-template有关用法