Проблема с Velocity - ResourceNotFoundException при использовании с Spring MVC - PullRequest
1 голос
/ 16 октября 2010

Я использую Spring MVC для своего веб-приложения и интегрирую 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 / speed / templateName.vm

Я указываю это при использовании bean-компонента SpeedEngine в моем контроллере, например:

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

Есть ли что-то, что мне нужно сделать в моем файле build.xml, чтобы убедиться, что он может найти мои файлы шаблонов?

Ответы [ 4 ]

9 голосов
/ 16 октября 2010

Я думаю, что проблема в том, что WEB-INF не является частью CLASSPATH. Вы не можете ожидать, что ClasspathResourceLoader найдет что-то, чего нет в CLASSPATH.

WEB-INF / классы и все файлы JAR в WEB-INF / lib находятся в CLASSPATH. Попробуйте переместить папку с файлами .vm в WEB-INF / classes и посмотреть, поможет ли это.

Лучшая идея - следовать документам Spring:

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

2 голосов
/ 20 августа 2013

Допустим, вы архивируете файлы * .vm в файл * .jar. И поместите его в свой WEB-INF / lib.

Затем включите следующий фрагмент в конфигурацию компонента, чтобы сделать его видимым для VelocityEngineUtils.

Работай как шарм ..!

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

Вы можете указать, какое место вашего ресурса (т.е. должно быть в вашем пути к классам) между <value>...</value> блоком.

2 голосов
/ 16 октября 2010

У меня возникла похожая проблема, и коренной причиной оказалось использование абсолютного пути. Так что попробуйте без ведущих '/':

String text = VelocityEngineUtils.mergeTemplateIntoString(
        velocityEngine, "WEB-INF/velocity/registrationEmail.vm", test);
0 голосов
/ 02 февраля 2012

Это больно.Если вы введете classpath, то разработка станет адом, поскольку контейнер сервлета будет перезагружать веб-приложение каждый раз, когда вы вносите изменения в шаблоны скорости.view.WebappResourceLoader, который значительно упрощает разработку, не требуя наличия файлов в пути к классам, а также позволяет выполнять относительные включения.

Вы также можете проверить мой пост об этом: Spring-mvc + Velocity + DCEVM

...