Проблема со скоростью — ResourceNotFoundException при использовании с Spring MVC

Я использую 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/velocity/templateName.vm

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

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

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


person TheJediCowboy    schedule 16.10.2010    source источник


Ответы (4)


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

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

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

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

person duffymo    schedule 16.10.2010
comment
Я попытался поместить свой каталог /velocity в /WEB-INF/classes/velocity, но это все равно вызвало у меня ту же проблему. Есть ли лучший способ сделать это или указать свойства скорости? - person TheJediCowboy; 16.10.2010
comment
Какой путь вы ему указали? Должна быть скорость/*.vm. Если он находится в WEB-INF/classes, вам не нужен префикс. - person duffymo; 16.10.2010
comment
Отлично, это сработало, мне любопытно, это нормальный метод (сохранение шаблонов скорости в каталоге классов)? Я мало что видел на эту тему, но слышал из разных источников одну и ту же практику. - person TheJediCowboy; 16.10.2010
comment
Конечно, почему бы не быть в порядке? Вы просто помещаете шаблоны в путь к классам, где загрузчик ресурсов может их найти. Какие потенциальные проблемы вас беспокоят? - person duffymo; 16.10.2010
comment
Я не беспокоюсь о каких-либо проблемах, у меня просто нет большого опыта, и я не каждый что-то помещал в каталог классов, но это работает хорошо, и я ценю помощь! - person TheJediCowboy; 18.10.2010

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

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

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

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

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

person mahesh nanayakkara    schedule 20.08.2013

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

String text = VelocityEngineUtils.mergeTemplateIntoString(
        velocityEngine, "WEB-INF/velocity/registrationEmail.vm", test);
person Péter Török    schedule 16.10.2010
comment
Я пробовал это, но он все еще не может найти файл .vm, мне интересно, где может быть моя ошибка... - person TheJediCowboy; 16.10.2010

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

Я бы рекомендовал использовать org.apache.velocity.tools.view.WebappResourceLoader, который значительно упрощает разработку, не требуя, чтобы файлы находились в пути к классам, а также позволяет делать относительные включения.

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

person Rafael Sanches    schedule 02.02.2012