2010-10-16 7 views
1

J'utilise Spring MVC pour mon application web et j'intègre Velocity pour modéliser mes emails. Je reçois l'erreur 500 suivante lorsque j'essaye d'envoyer mon email.Problème avec Velocity - ResourceNotFoundException lors de l'utilisation avec Spring MVC

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

Je suis conscient de ce que cela signifie et ce que je dois faire, mais je sais que je dois faire quelque chose de mal et je ne peux pas comprendre pourquoi il ne peut pas trouver mes .vm fichiers.

J'ai configuré la vélocité dans mon fichier applicationContext.xml comme ci-dessous, mais je crois que je pourrais laisser les propriétés nécessaires à Velocity pour trouver le fichier. Je crois que c'est peut-être là où j'ai besoin de faire quelques changements/ajouts, mais je ne suis pas sûr.

Le chemin de mes fichiers de modèle est WEB-INF/vitesse/templateName.vm

Je précise ceci lorsque vous utilisez la fève de velocityEngine dans mon contrôleur ainsi comme le

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

Y at-il quelque chose que je dois faire dans mon fichier build.xml pour m'assurer qu'il est capable de trouver mes fichiers modèles?

Répondre

9

Je pense que le problème est que non WEB-INF partie de CLASSPATH. Vous ne pouvez pas attendre le ClasspathResourceLoader pour trouver quelque chose qui n'est pas dans le CLASSPATH.

WEB-INF/classes et tous les fichiers JAR dans WEB-INF/lib sont dans le CLASSPATH. Essayez de déplacer votre dossier avec les fichiers .vm sous WEB-INF/classes et voir si cela aide.

meilleure idée de tous est de suivre au printemps docs:

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

+0

J'ai essayé de placer mon répertoire/velocity sous/WEB-INF/classes/velocity mais il a quand même donné moi le même problème. Existe-t-il une meilleure façon de faire cela ou de spécifier les propriétés de vélocité? – TheJediCowboy

+1

Quel chemin avez-vous donné? Cela aurait dû être "vélocité/* .vm". Si c'est dans WEB-INF/classes, vous n'avez pas besoin du préfixe. – duffymo

+0

Super, cela a fonctionné, je suis curieux, est-ce une bonne façon de faire cela (en conservant les modèles de vélocité dans le répertoire des classes)? Je n'ai pas beaucoup vu sur le sujet, mais j'ai entendu de multiples sources la même pratique. – TheJediCowboy

2

J'ai rencontré un problème similaire et là la cause première s'est avérée être l'utilisation du chemin absolu. Alors, essayez sans le '/':

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

J'ai essayé ceci, mais il est toujours incapable de trouver le fichier .vm, je me demandais où mon erreur pourrait être ... – TheJediCowboy

0

C'est douloureux. Si vous mettez dans le classpath alors le développement devient un enfer, puisque le conteneur de servlet rechargerait la webapp chaque fois que vous faites un changement dans les modèles de vélocité.

Je vous recommande d'utiliser le org.apache.velocity.tools.view.WebappResourceLoader, ce qui facilite grandement le développement en ne nécessitant pas que les fichiers se trouvent dans le chemin de classe et vous permet également de faire des inclusions relatives.

Vous pouvez également consulter mon post à ce sujet: Spring-mvc + Velocity + DCEVM

2

Dites vous archivez les fichiers * .VM dans un fichier * .jar. Et mettez-le dans votre WEB-INF/lib.

Ensuite, incluez le fragment suivant dans votre configuration de bean pour le rendre visible à VelocityEngineUtils.

Travaillez comme un charme ..!

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

Vous pouvez donner ce que toutes les ressources de votre emplacement (i.e., devrait être dans votre chemin de classe) entre <value>...</value> bloc.