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.
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");
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.
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
.
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.