簡體   English   中英

速度問題-與Spring MVC一起使用時出現ResourceNotFoundException

[英]Problem with Velocity - ResourceNotFoundException when using with Spring MVC

我正在將Spring MVC用於我的Web應用程序,並且正在集成Velocity來模板化電子郵件。

嘗試發送我的電子郵件時,出現以下500錯誤。

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

我知道這意味着什么以及我需要做什么,但是我知道我必須做錯了什么,我無法弄清為什么找不到我的.vm文件。

我已經在applicationContext.xml文件中配置了Velocity,如下所示,但我認為可能遺漏了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文件中做些什么來確保它能夠找到我的模板文件?

我認為問題在於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

假設您將* .vm文件歸檔在* .jar文件中。 並將其放在您的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>塊之間給出每個資源位置(即應該在類路徑中)。

我也遇到過類似的問題,根本原因是使用絕對路徑。 因此,請在沒有前導'/'情況下進行嘗試:

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

真痛苦 如果放入類路徑,則開發將陷入困境,因為每次更改速度模板時,servlet容器都會重新加載webapp。

我建議使用org.apache.velocity.tools.view.WebappResourceLoader,它通過不需要將文件放在類路徑中而使開發變得更加容易,並且還允許您進行相對包含。

您還可以檢查有關此內容的我的帖子: Spring-mvc + Velocity + DCEVM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM