Velocity无法找到资源

出了点问题,非常令人沮丧。 我在velocity的主页上读到,当我运行webapp时,应该设置一些属性。 我已经做到了,但无论我做什么,我都会遇到同样的错误。
这是我设置道具和使用速度的地方

public class ConfirmationMailGenerator implements MailGenerator { private BasicUser user; private String htmlTemplate = "HTMLConfirmationMailTemplate.vsl"; private String plainTemplate = "PlainConfirmationMailTemplate.vsl"; public ConfirmationMailGenerator(BasicUser user) { this.user = user; } public StringWriter generateHTML() throws Exception { Properties props = new Properties(); props.setProperty("resource.loader", "wepapp"); props.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.WebappResourceLoader"); props.setProperty("webapp.resource.loader.path", "/WEB-INF/mailtemplates/"); VelocityEngine engine = new VelocityEngine(props); VelocityContext context = new VelocityContext(); engine.init(); Map map = createDataModel(); context.put("user", map); Template template = engine.getTemplate(htmlTemplate); StringWriter writer = new StringWriter(); template.merge(context, writer); return writer; } ... } 

这些文件当然保存在/ WEB-INF / mailtemplates /中。
如果我使用这个我得到这个错误:

 SEVERE: ResourceManager : unable to find resource 'HTMLConfirmationMailTemplate.vsl' in any resource loader. SEVERE: The log message is null. 

感谢您的时间:)

您正在使用Webapp资源加载器,该资源加载器适用于Velocity Tools servlet提供的页面。 (它需要一些特殊的初始化来查找servlet上下文的根)。

我建议您使用ClasspathResourceLoader,然后将文件放入WEB-INF / classes或类路径中的其他位置。 这确实是最直接的方法。

 resource.loader = class class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 

更多信息在这里:

https://velocity.apache.org/engine/1.7/apidocs/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.html

请问Glass的答案是否正确,但配置应该是:

 resource.loader = class class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 

请注意第二行开头的class 。 有关详细信息,请参阅他提供的链接!

注意:由于特权而做出答案而不是评论。

Velocity可能正在使用类加载器来查找这些文件。 我建议将它们放在WEB-INF / classes中,默认情况下位于CLASSPATH中。

我很好,如下,

velocity.properties文件中

 resource.loader=class, file class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader file.resource.loader.path=vm_template runtime.log.logsystem.class=org.apache.velocity.runtime.log.SimpleLog4JLogSystem runtime.log.logsystem.log4j.category=velocity input.encoding=UTF-8 output.encoding=UTF-8 

在我的java课上

 import java.io.StringWriter; import java.util.Properties; import org.apache.log4j.Logger; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.tools.generic.DateTool; import org.apache.velocity.tools.generic.EscapeTool; import org.apache.velocity.tools.generic.LoopTool; import org.apache.velocity.tools.generic.MathTool; import org.apache.velocity.tools.generic.NumberTool; import org.apache.velocity.tools.generic.SortTool; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; public class VelocitySupport implements InitializingBean { private static Logger log = Logger.getLogger(VelocitySupport.class); @Autowired private Properties properties; public final void afterPropertiesSet() throws Exception { location = location.replace("classpath:", ""); Resource res = new ClassPathResource(location); Properties prop = new Properties(); prop.load(res.getInputStream()); String staticDir = System.getProperty("staticDir"); String tempPath = prop.getProperty("file.resource.loader.path"); tempPath = staticDir + "/" + tempPath; prop.setProperty("file.resource.loader.path", tempPath); Velocity.init(prop); } public static String merge(final String template, final VelocityContext vc) throws Exception { try { vc.put("date", new DateTool()); vc.put("escape", new EscapeTool()); vc.put("math", new MathTool()); vc.put("number", new NumberTool()); vc.put("iterate", new LoopTool()); vc.put("sort", new SortTool()); Template temp = Velocity.getTemplate(template); StringWriter sw = new StringWriter(); temp.merge(vc, sw); sw.flush(); return sw.toString(); } catch (ResourceNotFoundException e) { log.error("", e); throw e; } catch (ParseErrorException e) { log.error("", e); throw e; } } private String location; public final void setLocation(final String location) { this.location = location; } } 

并插入项目的VM参数如下..

 -DstaticDir= "your directory for template path" 

这可能对你有所帮助 ……

为了解决这个错误–WEB-INF / classes和WEB-INF / lib中的所有JAR都在CLASSPATH中。 尝试使用WEB-INF / classes下的.vm文件移动文件夹 – 不要放置绝对路径,例如。 如果abc.vm文件位于/ public_html / WEB-INF文件夹中,则将path =“/ public_html/WEB-INF/abc.vm”放入速度模板路径。