加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Spring中使用Velocity的WebappResourceLoader

发布时间:2020-12-15 01:18:44 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用Velocity创建由Spring的JavaMailSender类发送的电子邮件模板.我决定用来在Web应用程序中找到Velocity模板的资源加载器是WebappResourceLoader,它位于Velocity工具jar中. 但是,根据我使用WebappResourceLoader的方式,我会在启动Web应用程序时获

我正在尝试使用Velocity创建由Spring的JavaMailSender类发送的电子邮件模板.我决定用来在Web应用程序中找到Velocity模板的资源加载器是WebappResourceLoader,它位于Velocity工具jar中.

但是,根据我使用WebappResourceLoader的方式,我会在启动Web应用程序时获得NPE或找不到模板.

如果在Spring应用程序上下文中为Velocity引擎指定了初始化属性,则将获得NPE.我的配置如下:

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
  <property name="velocityProperties">
        <props>
        <prop key="resource.loader">webapp</prop>
        <prop key="webapp.resource.loader.class">org.apache.velocity.tools.view.WebappResourceLoader</prop>
        <prop key="webapp.resource.loader.path">/WEB-INF/velocity/</prop>
        </props>
   </property>
</bean>

应用启动时得到的堆栈跟踪为:

java.lang.NullPointerException
at org.apache.velocity.tools.view.WebappResourceLoader.getResourceStream(WebappResourceLoader.java:145)
at org.apache.velocity.runtime.resource.loader.ResourceLoader.resourceExists(ResourceLoader.java:224)
at org.apache.velocity.runtime.resource.ResourceManagerImpl.getLoaderForResource(ResourceManagerImpl.java:641)
at org.apache.velocity.runtime.resource.ResourceManagerImpl.getLoaderNameForResource(ResourceManagerImpl.java:624)
at org.apache.velocity.runtime.RuntimeInstance.getLoaderNameForResource(RuntimeInstance.java:1464)
at org.apache.velocity.runtime.VelocimacroFactory.initVelocimacro(VelocimacroFactory.java:159)
at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:261)
at org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:107)
at org.springframework.ui.velocity.VelocityEngineFactory.createVelocityEngine(VelocityEngineFactory.java:251)
at org.springframework.ui.velocity.VelocityEngineFactoryBean.afterPropertiesSet(VelocityEngineFactoryBean.java:57)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)

为了解决这个问题,我将应用程序上下文更改为以下内容:

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean" />

然后在服务类中,在将应用程序数据与模板合并的代码之前(位于/ WEB-INF / velocity并命名为regemail.vm),在代码之前,我添加了以下代码:

    velocityEngine.addProperty("resource.loader","webapp");
    velocityEngine.addProperty("webapp.resource.loader.class","org.apache.velocity.tools.view.WebappResourceLoader");
    velocityEngine.addProperty("webapp.resource.loader.path","/WEB-INF/velocity/");
    velocityEngine.setApplicationAttribute("javax.servlet.ServletContext","localhost:8080");

该应用程序启动正常,但是当要发送电子邮件时,出现以下错误:

SEVERE: Servlet.service() for servlet default threw exception
org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'regmail.vm'
at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:483)
at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:354)
at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1400)
at org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:370)
at org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:345)
at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplate(VelocityEngineUtils.java:58)
at org.springframework.ui.velocity.VelocityEngineUtils.mergeTemplateIntoString(VelocityEngineUtils.java:122)
at com.mywebapp.web.service.RegistrationServiceImpl$1.prepare(RegistrationServiceImpl.java:60)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:353)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
at com.mywebapp.web.service.RegistrationServiceImpl.sendRegEmail(RegistrationServiceImpl.java:65)
at com.mywebapp.web.controller.SignUpController.onSubmit(SignUpController.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

我正在使用Velocity版本1.6.4和Velocity工具2.0.任何帮助,不胜感激.谢谢!

最佳答案
您需要传递ServletContext对象:

velocityEngine.setApplicationAttribute("javax.servlet.ServletContext",request.getSession().getServletContext());

另一种选择是改为使用ClasspathResourceLoader并将模板放在classpath中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读