Velocity问题 - 与Spring MVC一起使用时的ResourceNotFoundException

时间:2010-10-16 15:54:10

标签: java spring velocity

我正在使用Spring MVC作为我的Web应用程序,我正在整合Velocity来模拟我的电子邮件。

我尝试发送电子邮件时收到以下500错误。

org.apache.velocity.exception.ResourceNotFoundException: 
Unable to find resource '/WEB-INF/velocity/registrationEmail.vm'

我知道这意味着什么以及我需要做什么,但我知道我必须做错事我无法弄清楚为什么它找不到我的 .vm 文件。

我已经在applicationContext.xml文件中配置了如下速度,但我相信我可能会留下必要的属性,Velocity需要找到该文件。

<bean id="velocityEngine" 
    class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
        <property name="velocityProperties">
             <value>
              resource.loader=class
               class.resource.loader.class=
               org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
             </value>
        </property>
    </bean>
    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
     <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>
    </bean>

我相信这可能是我需要进行一些更改/添加的地方,但我不确定。

我的模板文件的路径是 WEB-INF / velocity / templateName.vm

我在控制器中使用velocityEngine bean时也指定了这个,如下面的

String text = VelocityEngineUtils.mergeTemplateIntoString(
                       velocityEngine, "/WEB-INF/velocity/registrationEmail.vm", test);

我的build.xml文件中是否需要执行某些操作以确保它能够找到我的模板文件?

4 个答案:

答案 0 :(得分:9)

我认为问题在于WEB-INF不是CLASSPATH的一部分。您不能指望ClasspathResourceLoader找到CLASSPATH中没有的内容。

WEB-INF / classes以及WEB-INF / lib中的所有JAR都在CLASSPATH中。尝试使用WEB-INF / classes下的.vm文件移动文件夹,看看是否有帮助。

最好的想法是遵循Spring文档:

http://static.springsource.org/spring/docs/2.5.x/reference/view.html#view-velocity

答案 1 :(得分:2)

我遇到了类似的问题,其根本原因是绝对路径的使用。所以在没有前导'/'

的情况下尝试一下
String text = VelocityEngineUtils.mergeTemplateIntoString(
        velocityEngine, "WEB-INF/velocity/registrationEmail.vm", test);

答案 2 :(得分:2)

假设您在* .jar文件中存档* .vm文件。并把它放在你的WEB-INF / lib中。

然后在bean配置中包含以下代码段,以使其对VelocityEngineUtils可见。

像魅力一样工作..!

<bean class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath">
<value>classpath:com/test/mail</value>
</property>
</bean>

您可以在<value>...</value>阻止之间给出您的每个资源位置(即应该在您的类路径中)。

答案 3 :(得分:0)

这很痛苦。如果您放入类路径,那么开发就变得很糟糕,因为每次在速度模板中进行更改时,servlet容器都会重新加载webapp。

我建议使用org.apache.velocity.tools.view.WebappResourceLoader,它不需要文件在类路径中,也允许你做相对包含,这使得开发变得更加容易。

您还可以查看我的帖子:Spring-mvc + Velocity + DCEVM