在Spring中使用Velocity的WebappResourceLoader

在Spring中使用Velocity的WebappResourceLoader,第1张

概述我正在尝试使用Velocity创建由Spring的JavaMailSender类发送的电子邮件模板.我决定用来在Web应用程序中找到Velocity模板的资源加载器是WebappResourceLoader,它位于Velocity工具jar中.但是,根据我使用WebappResourceLoader的方式,我会在启动Web应用程序时获得NPE或找不到模板.如

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

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

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

<bean ID="veLocityEngine" >  <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.NullPointerExceptionat 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"  />

然后在服务类中,在将应用程序数据与模板合并的代码之前(位于/ 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 exceptionorg.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.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中. 总结

以上是内存溢出为你收集整理的在Spring中使用Velocity的WebappResourceLoader 全部内容,希望文章能够帮你解决在Spring中使用Velocity的WebappResourceLoader 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1233800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存