2010-08-09 7 views
17

Quelque chose ne va pas et c'est très frustrant. Je lis sur la page d'accueil de Velocity que lorsque je lance une webapp, certaines propriétés doivent être définies. Et je l'ai fait mais peu importe ce que je fais, je continue à avoir la même erreur.
C'est là que je mets les accessoires et la vitesse d'utilisationLa vitesse ne peut pas trouver la ressource

public class ConfirmationMailGenerator implements MailGenerator { 

    private BasicUser user; 
    private String htmlTemplate = "HTMLConfirmationMailTemplate.vsl"; 
    private String plainTemplate = "PlainConfirmationMailTemplate.vsl"; 

    public ConfirmationMailGenerator(BasicUser user) { 
     this.user = user; 
    } 

    public StringWriter generateHTML() throws Exception { 
     Properties props = new Properties(); 
     props.setProperty("resource.loader", "wepapp"); 
     props.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.WebappResourceLoader"); 
     props.setProperty("webapp.resource.loader.path", "/WEB-INF/mailtemplates/"); 
     VelocityEngine engine = new VelocityEngine(props); 
     VelocityContext context = new VelocityContext(); 

     engine.init(); 

     Map map = createDataModel(); 
     context.put("user", map); 

     Template template = engine.getTemplate(htmlTemplate); 
     StringWriter writer = new StringWriter(); 
     template.merge(context, writer); 

     return writer; 
    } 
... 
} 

Les fichiers est bien sûr enregistré dans/WEB-INF/mailtemplates /.
Si j'utilise ce que je reçois cette erreur:

SEVERE: ResourceManager : unable to find resource 'HTMLConfirmationMailTemplate.vsl' in any resource loader. 
SEVERE: The log message is null. 

Merci pour votre temps :)

Répondre

27

Vous utilisez le chargeur de ressources Webapp, qui est destiné aux pages servies par le servlet Velocity Tools. (Il nécessite une initialisation spéciale pour trouver la racine du contexte de servlet).

Je vous recommande d'utiliser le ClasspathResourceLoader, puis de placer les fichiers dans WEB-INF/classes, ou ailleurs dans votre classpath. C'est vraiment l'approche la plus simple.

resource.loader = class 
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 

Plus d'info ici:

https://velocity.apache.org/engine/1.7/apidocs/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.html

+1

@Will Glass s'il vous plaît expliquer où écrire votre code – gstackoverflow

1

Velocity utilise probablement le chargeur de classe pour trouver ces fichiers. Je recommande de les mettre dans WEB-INF/classes, qui est dans le CLASSPATH par défaut.

+1

Je ne pense pas que cela fonctionnera. Le WebappResourceLoader recherche des ressources dans la racine de la webapp, qu'il ne connaît pas puisque VelocityEngine a été initialisé sans référence au ServletContext.Vous pensez à ClasspathResourceLoader - voir ma réponse. –

2

répondrez Le verre est correcte, mais la configuration doit être:

resource.loader = class 
class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 

Notez le class au début de la deuxième ligne . Voir les liens fournis par lui pour plus de détails !.

Remarque: Faire une réponse à la place d'un commentaire en raison de privilèges.

0

Je suis bien comme suit,

Dans velocity.properties fichier

resource.loader=class, file 
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 
file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader 
file.resource.loader.path=vm_template 
runtime.log.logsystem.class=org.apache.velocity.runtime.log.SimpleLog4JLogSystem 
runtime.log.logsystem.log4j.category=velocity 
input.encoding=UTF-8 
output.encoding=UTF-8 

Et à ma classe java

import java.io.StringWriter; 
import java.util.Properties; 
import org.apache.log4j.Logger; 
import org.apache.velocity.Template; 
import org.apache.velocity.VelocityContext; 
import org.apache.velocity.app.Velocity; 
import org.apache.velocity.exception.ParseErrorException; 
import org.apache.velocity.exception.ResourceNotFoundException; 
import org.apache.velocity.tools.generic.DateTool; 
import org.apache.velocity.tools.generic.EscapeTool; 
import org.apache.velocity.tools.generic.LoopTool; 
import org.apache.velocity.tools.generic.MathTool; 
import org.apache.velocity.tools.generic.NumberTool; 
import org.apache.velocity.tools.generic.SortTool; 
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.Resource; 

public class VelocitySupport implements InitializingBean { 
private static Logger log = Logger.getLogger(VelocitySupport.class); 

@Autowired private Properties properties; 

public final void afterPropertiesSet() throws Exception { 
    location = location.replace("classpath:", ""); 
    Resource res = new ClassPathResource(location); 

    Properties prop = new Properties(); 
    prop.load(res.getInputStream()); 

    String staticDir = System.getProperty("staticDir"); 
    String tempPath = prop.getProperty("file.resource.loader.path"); 
    tempPath = staticDir + "/" + tempPath; 

    prop.setProperty("file.resource.loader.path", tempPath); 
    Velocity.init(prop); 
} 

public static String merge(final String template, final VelocityContext vc) throws Exception { 
    try { 
     vc.put("date", new DateTool()); 
     vc.put("escape", new EscapeTool()); 
     vc.put("math", new MathTool()); 
     vc.put("number", new NumberTool()); 
     vc.put("iterate", new LoopTool()); 
     vc.put("sort", new SortTool()); 

     Template temp = Velocity.getTemplate(template); 

     StringWriter sw = new StringWriter(); 
     temp.merge(vc, sw); 
     sw.flush(); 

     return sw.toString(); 
    } 
    catch (ResourceNotFoundException e) { 
     log.error("", e); 
     throw e; 
    } 
    catch (ParseErrorException e) { 
     log.error("", e); 
     throw e; 
    } 
} 

private String location; 

public final void setLocation(final String location) { 
    this.location = location; 
} 
} 

et insérer VM arguments de projet suivre ..

-DstaticDir= "your directory for template path" 

Cela peut être utile pour vous ...

0

Pour résoudre cette erreur --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 --dont mettre le chemin abolute par exemple. Si le fichier abc.vm se trouve dans le répertoire/public_html/WEB-INF, placez path = "/public_html/WEB-INF/abc.vm" pour le chemin du modèle de vélocité.

Questions connexes