何かが間違っていて、それは非常にイライラします。 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.
お時間をいただきありがとうございます:)
Velocity Toolsサーブレットによって提供されるページを対象としたWebappリソースローダーを使用しています。 (サーブレットコンテキストのルートを見つけるには、特別な初期化が必要です)。
ClasspathResourceLoaderを使用してから、ファイルをWEB-INF/classes、またはクラスパスの別の場所に配置することをお勧めします。これは本当に最も簡単な方法です。
resource.loader = class
class.resource.loader.class = org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader
詳細はこちら:
Glassの答えは正しいですが、構成は次のようになります。
resource.loader = class
class.resource.loader.class = org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader
2行目の先頭のclass
に注意してください。詳細については、彼が提供するリンクを参照してください。
注:権限により、コメントの代わりに回答する。
Velocityはおそらくこれらのファイルを見つけるためにクラスローダーを使用しています。デフォルトではCLASSPATHにあるWEB-INF/classesに置くことをお勧めします。
私は次のように元気です、
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フォルダーにある場合、velocityテンプレートパスにpath = "/public_html/WEB-INF/abc.vm"を入力します。