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 réel est contenu dans le classpath 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 saisir le modèle, et le traiter, mais taac-web est l'endroit où le modèle est stocké (en particulier dans: WEB-INF/classes/email/vendor.tpl) - j'ai tout essayé de l'utiliser springs ressource classpath à l'aide de la méthode setClassForTemplateLoading freemarkers. Je suppose que cela fonctionnerait:

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

Pourtant, j'obtiens toujours une exception FileNotFoundException. Quelqu'un peut m'expliquer la meilleure façon d'obtenir un modèle à partir du classpath?

Merci.

32
demandé sur wuntee 2010-06-11 04:10:45

4 réponses

C'est ce qui a fini par fonctionner pour moi:

freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
72
répondu wuntee 2010-06-11 19:46:26
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");

Utilisez cette méthode pour charger les classes à partir du package où se trouve votre classe, donc si votre classe est

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

3
répondu user738048 2013-10-16 15:35:11

En 2017, ce qui suit est obsolète:

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 se réfèrent à la version actuelle de FreeMarker.

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

3
répondu Jan Bodnar 2017-03-05 17:56:33

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

À la place, créez une instance de StrutsClassTemplateLoader. (Je le fais dans une sous-classe de FreemarkerManager ses getTemplateLoader méthode.) Il ne prend aucun paramètre, donc vraisemblablement il sait juste comment les entretoises et les Conventions font les choses.

0
répondu Rodney Gitzel 2011-05-27 23:33:25