我正在尝试使用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)
最佳答案
您需要传递ServletContext对象:
veLocityEngine.setApplicationAttribute("javax.servlet.ServletContext",request.getSession().getServletContext());
另一种选择是改为使用ClassPathResourceLoader并将模板放在classpath中.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。