2010-11-13 21 views
3

J'ai une application Java EE 6 dans laquelle j'aimerais utiliser la vélocité pour générer des mails à partir d'un modèle. J'ai un bean @Named qui est chargé de charger et de remplir un modèle particulier. Le projet est une application web, j'ai donc placé mes templates dans WEB-INF/classes (ce qui btw semble plutôt moche, mais je n'ai pas trouvé de solution plus élégante maintenant) et utilisé le ClasspathResourceLoader pour accéder aux fichiers. La configuration est la suivante:Comment charger un modèle de vélocité dans un EJB à utiliser comme modèle de courrier

Properties props = new Properties(); 
props.setProperty("resource.loader", "class"); 
props.setProperty("resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 

VelocityEngine engine = new VelocityEngine(props); 
VelocityContext context = new VelocityContext(); 

engine.init(); 

context.put("myObject", myObject); 
Template template = engine.getTemplate("mail_template.vm"); 

StringWriter writer = new StringWriter(); 
template.merge(context, writer); 

exécution de ce code produit l'exception follwing:

Caused by: java.lang.UnsupportedOperationException: Could not retrieve ServletContext from application attributes 
    at org.apache.velocity.runtime.log.ServletLogChute.init(ServletLogChute.java:73) 
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157) 

Je suis obligé de remettre ServletContext au moteur de vitesse. Mais mon bean n'est pas conscient de ce contexte et je ne veux pas utiliser une servlet pour envoyer des mails. Le frontent est implémenté avec JSF 2.0 afin que je puisse accéder à FacesContext.getCurrentInstance(). GetExternalContext(). GetContext(), le transtyper en ServletContext et le fournir au moteur. Cependant, le contexte est toujours nul, et je n'ai aucune idée de comment tout faire fonctionner. Chaque indice/solution est très appréciée :)

Merci à l'avance, Alex

Répondre

2

Velocity peut fonctionner dans tous les environnements, donc servlets ne sont pas une exigence. Il semble que le problème soit lié à la fonction de journalisation, dont la valeur par défaut dépend d'une servlet.

Vous pouvez utiliser un NullLogChute ou, en fonction de votre infrastructure de journalisation, choisir une classe implémentant LogChute. Par exemple, si vous utilisez la consignation, vous aurez besoin de CommonsLogLogChute. Comment configurer:

Pour utiliser, d'abord mis en place diagraphie des communes, puis dire la vitesse à utiliser cette classe pour l'enregistrement en ajoutant ce qui suit à votre velocity.properties: runtime.log.logsystem.class = org .apache.velocity.runtime.log.CommonsLogLogChute

Vous pouvez également définir cette propriété pour spécifier à quel journal/nom les messages de Velocity doivent être enregistrés (l'exemple ci-dessous est par défaut). runtime.log.logsystem.commons.logging.name = org.apache.velocity

Ainsi, en dehors de fournir ce paramètre dans velocity.properties, vous pouvez appeler:

engine.setProperty("runtime.log.logsystem.class", 
     "org.apache.velocity.runtime.log.CommonsLogLogChute"); 
+0

Merci Bozho, que résolu le problème de journalisation pour moi. Maintenant, je suis confronté au problème de ne pas trouver mon modèle (à nouveau). Comme mentionné ci-dessus j'ai utilisé le ClasspathResourceLoader, ayant mes modèles dans un pot comme décrit ici: http://velocity.apache.org/engine/releases/velocity-1.5/developer-guide.html#configuring_resource_loaders Donc, avez-vous une solution pour ce problème aussi bien? Je vous remercie! Alex – alexhanschke

+0

Trouvé le problème, la propriété est appelée 'class.resource.loader.class' pas 'resource.loader.class' – alexhanschke