Java 如何将velocity模板加载到EJB中用作邮件模板

Java 如何将velocity模板加载到EJB中用作邮件模板,java,templates,jsf,classloader,velocity,Java,Templates,Jsf,Classloader,Velocity,我有一个JavaEE6应用程序,我想在其中使用velocity从模板生成邮件。我有一个@namedbean,负责加载和填充特定模板。该项目是一个web应用程序,因此我将模板放入web-INF/类中(顺便说一句,这似乎很难看,但我现在还没有找到更优雅的解决方案),并使用ClasspathResourceLoader访问文件。配置如下: Properties props = new Properties(); props.setProperty("resource.loader", "class")

我有一个JavaEE6应用程序,我想在其中使用velocity从模板生成邮件。我有一个@namedbean,负责加载和填充特定模板。该项目是一个web应用程序,因此我将模板放入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交给velocity引擎。但是我的bean不知道这个上下文,我不想使用servlet发送邮件。frontent是用JSF 2.0实现的,因此我可以访问FacesContext.getCurrentInstance().getExternalContext().getContext(),将其转换为ServletContext并提供给引擎。然而,上下文总是空的,我只是不知道如何让一切正常工作。非常感谢每一个提示/解决方案:)

提前感谢,,
Alex

Velocity可以在任何环境中运行,因此不需要servlet。这个问题似乎与日志功能有关,它的默认设置依赖于servlet

您可以使用
nulllogsleet
,或者,根据您的日志框架,选择实现
logsleet
的类。例如,如果您使用commons日志记录,您需要。如何设置它:

要使用,首先设置commons日志记录,然后通过将以下内容添加到Velocity.properties中,告诉Velocity使用此类进行日志记录:runtime.log.logsystem.class=org.apache.Velocity.runtime.log.commons

您还可以设置此属性以指定应将Velocity的消息记录到的日志/名称(以下示例为默认值)。runtime.log.logsystem.commons.logging.name=org.apache.velocity

因此,除了在velocity.properties中提供此设置外,您还可以调用:

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

谢谢你,波佐,这为我解决了日志问题。现在我遇到了找不到模板的问题(再次)。如上所述,我使用了ClasspathResourceLoader,将我的模板放在一个jar中,如下所述:那么,您也有解决这个问题的方法吗?非常感谢。如果发现问题,则该属性名为“class.resource.loader.class”,而不是“resource.loader.class”