web-dev-qa-db-fra.com

Définition du modèle freemarker à partir de classpath

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 lui-même est contenu dans le chemin d'accès aux classes de l'application Web. Donc, il y a 2 projets, un 'taac-backend-api' et un autre 'taac-web'; taac-backend-api a le code pour récupérer le modèle et le traiter, mais c'est dans taac-web que le modèle se trouve (en particulier dans: WEB-INF/classes/email/vendor.tpl) - j'ai tout essayé depuis l'utilisation springs classpath ressource à l'aide de la méthode Freemarkers setClassForTemplateLoading. Je suppose que cela fonctionnerait:

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

pourtant, je reçois toujours une exception FileNotFoundException. Quelqu'un peut-il expliquer le meilleur moyen d'obtenir un modèle à partir du classpath?

Merci.

34
wuntee

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

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

Utilisez cette méthode pour charger les classes à partir du package contenant votre classe. Ainsi, si votre classe est 

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

4
user738048

En 2017, les éléments suivants sont obsolètes:

Configuration conf = new Configuration();

Nous devrions 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 font référence à la version actuelle de FreeMarker.

Le répertoire views se trouve dans src/main/resources

3
Jan Bodnar

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

Au lieu de cela, créez 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 il sait probablement comment Struts et Conventions font les choses.

0
Rodney Gitzel