Как загрузить шаблон скорости в EJB для использования в качестве почтового шаблона - PullRequest
3 голосов
/ 14 ноября 2010

У меня есть приложение Java EE 6, в котором я хотел бы использовать скорость для генерации писем из шаблона.У меня есть бин @Named, который отвечает за загрузку и заполнение определенного шаблона.Проект представляет собой веб-приложение, поэтому я поместил свои шаблоны в классы WEB-INF / (что, между прочим, кажется довольно уродливым, но я пока не нашел более элегантного решения) и использовал ClasspathResourceLoader для доступа к файлам.Конфигурация выглядит следующим образом:

Properties props = new Properties();
props.setProperty("resource.loader", "class");
props.setProperty("resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");

VelocityEngine engine = new VelocityEngine(props);
VelocityContext context = new VelocityContext();

engine.init();

context.put("myObject", myObject);
Template template = engine.getTemplate("mail_template.vm");

StringWriter writer = new StringWriter();
template.merge(context, writer);

Запуск этого кода приводит к следующему исключению:

Caused by: java.lang.UnsupportedOperationException: Could not retrieve ServletContext from application attributes
    at org.apache.velocity.runtime.log.ServletLogChute.init(ServletLogChute.java:73)
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157)

Поэтому я должен передать ServletContext механизму скорости.Но мой бин не знает об этом контексте, и я не хочу использовать сервлет для отправки почты.Интерфейс реализован с помощью JSF 2.0, поэтому я могу получить доступ к FacesContext.getCurrentInstance (). GetExternalContext (). GetContext (), привести его к ServletContext и предоставить его движку.Однако контекст всегда нулевой, и я просто понятия не имею, как заставить все работать.Каждый совет / решение высоко ценится:)

Заранее спасибо, Алекс

1 Ответ

2 голосов
/ 14 ноября 2010

Скорость может работать в любой среде, поэтому сервлеты не являются обязательными. Похоже, что проблема связана со средством ведения журнала, по умолчанию которого используется сервлет.

Вы можете использовать NullLogChute или, в зависимости от вашей среды ведения журналов, выбрать класс, реализующий LogChute. Так, например, если вы используете общий учет, вам понадобится CommonsLogLogChute. Как его настроить:

Для использования сначала настройте ведение журнала общего пользования, а затем скажите Velocity использовать этот класс для ведения журнала, добавив в ваши speed.properties следующее: runtime.log.logsystem.class = org.apache.velocity.runtime.log CommonsLogLogChute

Вы также можете установить это свойство, чтобы указать, к какому журналу / имени должны поступать сообщения Velocity (пример ниже по умолчанию). runtime.log.logsystem.commons.logging.name = org.apache.velocity

Таким образом, помимо предоставления этой настройки в speed.properties, вы можете позвонить:

engine.setProperty("runtime.log.logsystem.class", 
       "org.apache.velocity.runtime.log.CommonsLogLogChute");
...