web-dev-qa-db-fra.com

Impossible de trouver les ressources du modèle de vélocité

Juste une application autonome simple de vélocité basée sur la structure maven. Voici l'extrait de code écrit en Scala pour rendre le modèle helloworld.vm dans le dossier ${basedir}/src/main/resources

com.ggd543.velocitydemo

import org.Apache.velocity.app.VelocityEngine
import org.Apache.velocity.VelocityContext
import Java.io.StringWriter

/**
 * @author ${user.name}
 */
object App {

  def main(args: Array[String]) {
    //First , get and initialize an engine
    val ve = new VelocityEngine();
    ve.init();

    //Second, get the template
    val resUrl = getClass.getResource("/helloworld.vm")
    val t = ve.getTemplate("helloworld.vm");   // not work 
//    val t = ve.getTemplate("/helloworld.vm");  // not work
//    val t = ve.getTemplate(resUrl.toString);  // not work yet
    //Third, create a context and add data
    val context = new VelocityContext();
    context.put("name", "Archer")
    context.put("site", "http://www.baidu.com")
    //Finally , render the template into a StringWriter
    val sw = new StringWriter
    t.merge(context, sw)
    println(sw.toString);
  }

}

quand compiler et exécuter le programme, j'ai eu l'erreur suivante:

2012-1-29 14:03:59 org.Apache.velocity.runtime.log.JdkLogChute log
严重: ResourceManager : unable to find resource '/helloworld.vm' in any resource loader.
Exception in thread "main" org.Apache.velocity.exception.ResourceNotFoundException: Unable to find resource '/helloworld.vm'
    at org.Apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.Java:474)
    at org.Apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.Java:352)
    at org.Apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.Java:1533)
    at org.Apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.Java:1514)
    at org.Apache.velocity.app.VelocityEngine.getTemplate(VelocityEngine.Java:373)
    at com.ggd543.velocitydemo.App$.main(App.scala:20)
    at com.ggd543.velocitydemo.App.main(App.scala)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:120)

Process finished with exit code 1
49
Archer

Excellente question - j'ai résolu mon problème aujourd'hui de la manière suivante en utilisant Ecilpse:

  1. Placez votre modèle dans la même hiérarchie de dossiers que votre code source (pas dans une hiérarchie de dossiers séparée même si vous l'incluez dans le chemin de génération) comme ci-dessous: Where to put your template file

  2. Dans votre code, utilisez simplement les lignes de code suivantes (en supposant que vous souhaitiez simplement que la date soit transmise sous forme de données):

    VelocityEngine ve = new VelocityEngine();
    ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
    ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
    ve.init();
    VelocityContext context = new VelocityContext();
    context.put("date", getMyTimestampFunction());
    Template t = ve.getTemplate( "templates/email_html_new.vm" );
    StringWriter writer = new StringWriter();
    t.merge( context, writer );
    

Voyons comment nous disons d'abord à VelocityEngine de regarder dans le classpath. Sans cela, il ne saurait pas où chercher.

91
user1681739

Je mets mon .vm sous le src/main/resources/templates, alors le code est:

Properties p = new Properties();
p.setProperty("resource.loader", "class");
p.setProperty("class.resource.loader.class", "org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init( p );       
VelocityContext context = new VelocityContext();           
Template template = Velocity.getTemplate("templates/my.vm");

cela fonctionne dans le projet web. 

Dans Eclipse, Velocity.getTemplate ("my.vm") fonctionne car velocity cherchera le fichier .vm dans src/main/resources/ou src/main/resources/templates, mais dans un projet Web, nous devons utiliser Velocity.getTemplate ("templates/my.vm");

21
frank

Vous pouvez simplement l'utiliser comme ceci: 

Template t = ve.getTemplate("./src/main/resources/templates/email_html_new.vm");

Ça marche.

6
Guernize

Assurez-vous que vous avez un chargeur de ressources correctement configuré. Consultez la documentation de Velocity pour obtenir de l'aide sur la sélection et la configuration d'un chargeur de ressources: http://velocity.Apache.org/engine/releases/velocity-1.7/developer-guide.html#resourceloaders

3
wau

J'ai rencontré le même problème avec intellij IDEA . Vous pouvez l'utiliser 

 VelocityEngine ve = new VelocityEngine();
    Properties props = new Properties();
    props.put("file.resource.loader.path", "/Users/Projects/Comparator/src/main/resources/");
    ve.init(props);

    Template t = ve.getTemplate("helloworld.vm");
    VelocityContext context = new VelocityContext();
3
Freeman

vous pouvez essayer d'ajouter ce code:

VelocityEngine ve = new VelocityEngine();
String vmPath = request.getSession().getServletContext().getRealPath("${your dir}");
Properties p = new Properties();
p.setProperty("file.resource.loader.path", vmPath+"//");
ve.init(p);

Je fais ça et passe!

2
xDemon
VelocityEngine velocityEngin = new VelocityEngine();
velocityEngin.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngin.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

velocityEngin.init();

Template template = velocityEngin.getTemplate("nameOfTheTemplateFile.vtl");

vous pouvez utiliser le code ci-dessus pour définir les propriétés du modèle de vélocité. Vous pouvez ensuite donner le nom du fichier tempalte lors de l’initialisation du modèle et il trouvera s’il existe dans le chemin de classe.

Toutes les classes ci-dessus proviennent du paquet org.Apache.velocity *

2
SheoSinha

Vous pouvez également placer votre dossier de modèles sous src/main/resources au lieu de src/main/Java. Cela fonctionne pour moi et c'est un emplacement préférable, car les modèles ne sont pas une source Java.

0
user689307

J'ai fait face à un problème similaire. Je copiais les modèles de courrier du moteur Velocity dans un mauvais dossier. Étant donné que JavaMailSender et VelocityEngine sont déclarés en tant que ressources sous MailService , il est nécessaire pour ajouter les modèles sous le dossier de ressources déclaré pour le projet.

J'ai fait les changements et cela a fonctionné. Mettez les modèles comme 

src/main/resources/templates/<package>/sampleMail.vm
0
Nikhil

Lorsque vous utilisez la jetée intégrée, la propriété webapp.resource.loader.path doit commencer par une barre oblique

webapp.resource.loader.path=/templates

sinon les modèles ne seront pas trouvés dans ../webapp/templates

0
SzB