【问题标题】:Problem with Velocity - ResourceNotFoundException when using with Spring MVC速度问题 - 与 Spring MVC 一起使用时出现 ResourceNotFoundException
【发布时间】:2011-04-26 08:41:52
【问题描述】:

我正在为我的 Web 应用程序使用 Spring MVC,并且我正在集成 Velocity 来模板化我的电子邮件。

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

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

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

我在 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时也指定了这一点,如下所示

字符串文本 = VelocityEngineUtils.mergeTemplateIntoString(
                       velocityEngine, "/WEB-INF/velocity/registrationEmail.vm", test);

我需要在 build.xml 文件中做些什么来确保它能够找到我的模板文件吗?

【问题讨论】:

    标签: java spring velocity


    【解决方案1】:

    我遇到过类似的问题,根本原因是绝对路径的使用。所以试试不带前导'/':

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

    【讨论】:

    • 我试过了,但它仍然无法找到 .vm 文件,我想知道我的错误可能在哪里......
    【解决方案2】:

    我认为问题在于 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

    【讨论】:

    • 我尝试将我的 /velocity 目录放在 /WEB-INF/classes/velocity 下,但它仍然给了我同样的问题。有没有更好的方法来做到这一点或指定速度属性?
    • 你给的路径是什么?应该是“速度/*.vm”。如果它在 WEB-INF/classes 中,则不需要前缀。
    • 太好了,这行得通,我很好奇,这是一种可行的方法吗(将速度模板保存在类目录中)?我在这个话题上看到的不多,但我从多个来源听到了同样的做法。
    • 当然可以,为什么不可以呢?您只是将模板放在资源加载器可以找到它们的类路径中。您担心的潜在问题是什么?
    • 我不担心任何问题,我只是没有太多经验,也没有在类目录中放置任何东西,但它运作良好,感谢帮助!
    【解决方案3】:

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

    我建议使用 org.apache.velocity.tools.view.WebappResourceLoader,它不需要文件位于类路径中,并且允许您执行相对包含,从而使开发更加容易。

    你也可以查看我的帖子:Spring-mvc + Velocity + DCEVM

    【讨论】:

      【解决方案4】:

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

      然后在您的 bean 配置中包含以下 sn-p 以使其对 VelocityEngineUtils 可见。

      像魅力一样工作..!

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

      您可以在&lt;value&gt;...&lt;/value&gt; 块之间提供您的每个资源位置(即应该在您的类路径中)。

      【讨论】:

        猜你喜欢
        • 2017-09-02
        • 2021-08-29
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多