web-dev-qa-db-ja.com

Velocityはリソースを見つけることができません

何かが間違っていて、それは非常にイライラします。 Velocityのホームページを読んだところ、Webアプリケーションを実行すると、いくつかのプロパティが設定されるはずです。そして、私はそれをやったが、どうしても同じエラーが出続ける。
ここで小道具を設定し、速度を使用します

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.

お時間をいただきありがとうございます:)

17
AnAmuser

Velocity Toolsサーブレットによって提供されるページを対象としたWebappリソースローダーを使用しています。 (サーブレットコンテキストのルートを見つけるには、特別な初期化が必要です)。

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

28
Will Glass

Glassの答えは正しいですが、構成は次のようになります。

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

2行目の先頭のclassに注意してください。詳細については、彼が提供するリンクを参照してください。

注:権限により、コメントの代わりに回答する。

2
Javier Mr

Velocityはおそらくこれらのファイルを見つけるためにクラスローダーを使用しています。デフォルトではCLASSPATHにあるWEB-INF/classesに置くことをお勧めします。

1
duffymo

私は次のように元気です、

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"

それはあなたに役立つかもしれません...

0
Cataclysm

このエラーを解決するために--WEB-INF/classesおよびWEB-INF/lib内のすべてのJARはCLASSPATHにあります。 WEB-INF/classesの下に.vmファイルを含むフォルダーを移動してみてください-絶対パスを入れないでください。 abc.vmファイルが/ public_html/WEB-INFフォルダーにある場合、velocityテンプレートパスにpath = "/public_html/WEB-INF/abc.vm"を入力します。

0
Arpit Agarwal