gpt4 book ai didi

spring - 在 Spring 中使用 Velocity Webapp ResourceLoader

转载 作者:行者123 更新时间:2023-12-01 16:08:53 27 4
gpt4 key购买 nike

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

但是,根据我使用 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 并将您的模板放在类路径中。

关于spring - 在 Spring 中使用 Velocity Webapp ResourceLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125994/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com