Скорость не может найти ресурс
Что-то не так, и это очень расстраивает. Я прочитал на начальной странице скорости, что, когда я запускаю 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.
Спасибо за ваше время:)
Ответы
Ответ 1
Вы используете репозиторий-загрузчик Webapp, который предназначен для страниц, обслуживаемых сервлетом Velocity Tools. (Для определения корня контекста сервлета требуется некоторая специальная инициализация).
Я рекомендую вам использовать ClasspathResourceLoader, а затем помещать файлы в WEB-INF/классы или в другом месте вашего пути к классам. Это действительно самый прямой подход.
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
Ответ 2
Будет ли ответ "Стекло" правильным, но конфигурация должна быть:
resource.loader = class
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Обратите внимание на class
в начале второй строки. См. Ссылки, предоставленные им для получения более подробной информации!
Примечание. Выполнение ответа вместо комментария из-за привилегий.
Ответ 3
Velocity, вероятно, использует загрузчик классов для поиска этих файлов. Я бы рекомендовал разместить их в WEB-INF/классах, которые по умолчанию находятся в CLASSPATH.
Ответ 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/классы и все JAR в WEB-INF/lib находятся в CLASSPATH. Попробуйте переместить папку с файлами .vm в разделе WEB-INF/classes
- не указывать путь, например. если файл abc.vm находится в папке /public _html/WEB-INF, тогда поместите путь = "/public_html/WEB-INF/abc.vm" для пути шаблона скорости.