2010-06-11 4 views
29

J'ai une application Web dont j'ai besoin pour obtenir manuellement un modèle Freemarker - le modèle est obtenu via une classe dans un projet de bibliothèque, mais le fichier tpl réel est contenu dans le chemin d'accès aux classes. Donc, il y a 2 projets, un 'taac-backend-api' et un autre 'taac-web'; taac-backend-api a le code pour saisir le template, et le traiter, mais taac-web est l'endroit où le template est stocké (en particulier dans: WEB-INF/classes/email/vendor.tpl) - J'ai tout essayé en utilisant Ressource ressource classpath à l'aide de la méthode Freecenter setClassForTemplateLoading. Je suppose que cela fonctionnerait:Définition d'un modèle Freemarker à partir du classpath

freemarkerConfiguration = new Configuration(); 
    freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), ""); 
    Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl"); 

pourtant, j'obtiens toujours une exception FileNotFoundException. Quelqu'un peut-il expliquer la meilleure façon d'obtenir un modèle du classpath?

Merci.

Répondre

71

c'est ce qui a fini par travailler pour moi:

freemarkerConfiguration = new Configuration(); 
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/"); 
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl"); 
0

Si vous utilisez Struts 2 et le plug-in Conventions, la solution de wuntee ne semble pas fonctionner: setClassForTemplateLoading à son tour crée une instance de ClassTemplateLoader qui doesn Ne pas trouver les fichiers dans des bocaux quel que soit le préfixe de chemin spécifié.

Créez à la place une instance de StrutsClassTemplateLoader. (Je le fais dans une sous-classe personnalisée de FreemarkerManager dans sa méthode getTemplateLoader.) Il ne prend aucun paramètre, donc probablement il sait juste comment Struts et Conventions font des choses.

+0

En fonction de la hiérarchie du chargeur de classes, il est parfois nécessaire d'examiner avec attention la classe que vous spécifiez pour 'ClassTemplateLoader'. Souvent, le mieux est d'utiliser le constructeur 'ClassTemplateLoader' qui prend un' ClassLoader' directement (au lieu d'un 'Class' - depuis 2.3.22), et de passer ensuite dans le chargeur de classe de contexte de thread de l'application web. – ddekany

3
freemarkerConfiguration = new Configuration(); 
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), ""); 
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl"); 

Utilisez cette méthode pour charger les classes du package où votre classe est situé, donc si votre classe est

org.foo.SomeClass les modèles sera recherchée dans /org/foo dans le classpath. Cela garde vos modèles stockés avec la classe qui les utilise/les charge.

3

En 2017, ce qui suit est dépréciée:

Configuration conf = new Configuration(); 

Nous devons passer freemarker.template.Version au constructeur:

Configuration conf = new Configuration(new Version(2, 3, 23)); 
conf.setClassForTemplateLoading(Application.class, "/views"); 

où les numéros de version se réfèrent à la version actuelle de FreeMarker. Le répertoire views se trouve au src/main/resources.

Questions connexes