Java 速度找不到资源

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3443819/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 00:49:55  来源:igfitidea点击:

Velocity can't find resource

javaweb-applicationsvelocity

提问by AnAmuser

Something is wrong and it is very frustrating. I read on velocity's homepage that when I run a webapp then some properties should be set. And I've done that but no matter what I do I keep getting the same error.
This is where I set the props and use 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;
    }
...
}

The files is of course saved in /WEB-INF/mailtemplates/.
If I use this I get this error:

这些文件当然保存在 /WEB-INF/mailtemplates/ 中。
如果我使用它,我会收到此错误:

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

Thank you for your time:)

感谢您的时间:)

采纳答案by Will Glass

You are using the Webapp resourceloader, which is intended for pages served by the Velocity Tools servlet. (It requires some special initialization to find the root of the servlet context).

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

I recommend you use the ClasspathResourceLoader, then put the files into WEB-INF/classes, or elsewhere in your classpath. This is really the most straight forward approach.

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

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

More info is here:

更多信息在这里:

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

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

回答by duffymo

Velocity is probably using the class loader to find those files. I'd recommend putting them in WEB-INF/classes, which is in the CLASSPATH by default.

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

回答by Javier Mr

Will Glass answer is correct, but the configuration should be:

Will Glass 的回答是正确的,但配置应该是:

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

Note the classat the beginning of the second line. See the links provided by him for more details!.

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

Note: Making an answer instead of a comment due to privileges.

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

回答by Cataclysm

I am fine it as follow,

我很好,如下所示,

In velocity.propertiesfile

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

And at my java class

在我的 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;
}
}

And insert VM arguments of project as follow..

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

-DstaticDir= "your directory for template path"

That may be helpful for you...

这可能对你有帮助......

回答by Arpit Agarwal

For resolving this error --WEB-INF/classes and all the JARs in WEB-INF/lib are in the CLASSPATH. Try moving your folder with the .vm files under WEB-INF/classes --dont put the abolute path eg. if abc.vm file is in /public_html/WEB-INF folder then put path = "/public_html/WEB-INF/abc.vm" for velocity 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" 作为速度模板路径。