【问题标题】:Velocity can't find resource速度找不到资源
【发布时间】:2011-03-27 12:11:25
【问题描述】:

出了点问题,非常令人沮丧。我在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.

感谢您的宝贵时间:)

【问题讨论】:

    标签: java web-applications velocity


    【解决方案1】:

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

    【讨论】:

    • 我认为这行不通。 WebappResourceLoader 在 webapp 的根目录中查找资源,因为 VelocityEngine 是在没有参考 ServletContext 的情况下初始化的,所以它不知道这些资源。您正在考虑 ClasspathResourceLoader - 请参阅我的回复。
    【解决方案2】:

    您正在使用 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

    【讨论】:

    • @Will Glass 请解释在哪里编写代码
    • 所以你确实需要“类”。在参数前面。我虽然那是印刷错误?
    【解决方案3】:

    威尔格拉斯回答正确,但配置应该是:

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

    注意第二行开头的class。详情请查看他提供的链接!

    注意:由于特权,请回答而不是发表评论。

    【讨论】:

      【解决方案4】:

      我很好,如下,

      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"
      

      这可能对你有帮助...

      【讨论】:

        【解决方案5】:

        为了解决这个错误 --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" 作为速度模板路径。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-28
          • 1970-01-01
          相关资源
          最近更新 更多