Скорость не может найти ресурс
Что-то не так, и это очень расстраивает. Я прочитал на домашней странице velocity, что когда я запускаю веб-приложение, то некоторые свойства должны быть установлены. И я сделал это, но независимо от того, что я делаю, я продолжаю получать ту же самую ошибку.
Здесь я устанавливаю опоры и использую скорость
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.
Спасибо, что уделили мне время:)
5 ответов:
Вы используете веб-приложение объект resourceloader, которая предназначена для страниц, которые обслуживаются с помощью инструментов скорость сервлета. (Требуется специальная инициализация, чтобы найти корень контекста сервлета).
Я рекомендую вам использовать ClasspathResourceLoader, а затем поместить файлы в WEB-INF / classes или в другое место в вашем classpath. Это действительно самый прямой подход.
resource.loader = class class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Подробнее здесь:
Will Glass ответ правильный, но конфигурация должна быть:
resource.loader = class class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Обратите внимание на
class
в начале второй строки. Смотрите ссылки, предоставленные им для более подробной информации!.Примечание: создание ответа вместо комментария из-за привилегий.
Velocity, вероятно, использует загрузчик классов для поиска этих файлов. Я бы рекомендовал поместить их в WEB-INF / classes, который по умолчанию находится в CLASSPATH.
Я прекрасно это понимаю, как следует,
В скорость.свойства файл
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 находятся в пути к классу. Попробуйте переместить папку с помощью кнопки .файлы виртуальных машин в разделе WEB-INF / classes -- не ставьте аболютный путь, например. если abc.файл виртуальной машины в /public_html/веб-inf-файл потом папку поместил путь = "/public_html/веб-инф/Азбука.vm " для пути шаблона скорости.