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.
c'est ce qui a fini par travailler 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 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.
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
.
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.