Velocity的FileResourceLoader无法找到资源

时间:2016-01-07 18:07:05

标签: java velocity

我使用Velocity来加载电子邮件模板。这些模板首先从FTP服务器下载,然后保存为临时文件。

但是,当我尝试加载模板时,我得到一个例外: org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'C:\Users\someUsername\AppData\Local\Temp\template1526050996884865454.html'

我确定该文件存在并且没有损坏。

这是我尝试加载模板的方式:

template = velocityEngine.getTemplate(tempFile.getCanonicalPath());

这里是我加载的velocity.properties文件(我已经检查过属性是否正确初始化了!)

file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader=file
file.resource.loader.path=.

问题出在哪里?是因为AppData文件夹默认是隐藏的吗?

1 个答案:

答案 0 :(得分:2)

我认为Velocity FileResourceLoader存在设计缺陷。基本上,如果你的file.resource.loader.path不是一个空字符串,它将会破坏作为file传递给它的任何绝对路径。此外,它具有特定于Unix / Linux的代码来“扼杀”(释义实际的代码注释)一个传递给它的绝对文件路径(给一个破坏的绝对路径重新植根于当前的path设置)。 / p>

解决方案1:file.resource.loader.path设置为空字符串(init()之前)并使用绝对文件路径作为file参数

ve.setProperty("file.resource.loader.path", "");
ve.init();
Template template = ve.getTemplate("C:\\Users\\someUsername\\AppData\\Local\\Temp\\template1526050996884865454.html");

解决方案2:path设置为临时文件的公共根目录,并仅将其相对于该路径提交:

ve.setProperty("file.resource.loader.path", "C:\\Users\\someUsername\\AppData\\Local\\Temp");
ve.init();
Template template = ve.getTemplate("template1526050996884865454.html");

最终我认为FileResourceLoader类会更好,如果它检测到任何绝对路径作为文件名传递给它,而不是试图将path设置混入其中。