我使用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文件夹默认是隐藏的吗?
答案 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
设置混入其中。