2010-06-11 15 views
29

Ich habe eine Webanwendung, die ich brauche, um eine Freemarker Vorlage manuell zu erhalten - die Vorlage wird über eine Klasse in einem Bibliotheksprojekt erhalten, aber die tatsächliche tpl Datei ist im Klassenpfad der Webanwendung enthalten. Also gibt es 2 Projekte, ein "taac-backend-api" und ein "taac-web"; Taac-Backend-API hat den Code, um die Vorlage zu greifen und zu verarbeiten, aber Taac-Web ist, wo die Vorlage speichert (speziell in: WEB-INF/Klassen/E-Mail/Vendor.tpl) - Ich habe alles aus der Verwendung versucht Springt die Klassenpfad-Ressource zur Verwendung der Freemarkers setClassForTemplateLoading-Methode. Ich nehme an, das würde funktionieren:Freimarkervorlage aus Klassenpfad setzen

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

noch bekomme ich immer eine FileNotFoundException. Kann jemand den besten Weg erklären, eine Vorlage vom Klassenpfad zu erhalten?

Danke.

Antwort

71

das ist, was für mich arbeiten endete:

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

Wenn Sie Struts 2 verwenden und die Konventionen Plugin-Lösung wuntee nicht zu funktionieren scheint: setClassForTemplateLoading wiederum eine Instanz von ClassTemplateLoader schafft, die doesn finde keine Dateien in Gläsern, egal welches Pfadpräfix angegeben ist.

Erstellen Sie stattdessen eine Instanz von StrutsClassTemplateLoader. (Ich mache das in einer benutzerdefinierten Unterklasse von FreemarkerManager in seiner getTemplateLoader Methode.) Es braucht keine Parameter, also weiß es vermutlich nur, wie Struts und Konventionen Dinge tun.

+0

Abhängig von der Klassenladerhierarchie muss manchmal sorgfältig geprüft werden, welche Klasse Sie für "ClassTemplateLoader" angeben. Oft ist es am besten, den 'ClassTemplateLoader' -Konstruktor zu verwenden, der einen' ClassLoader' direkt (statt einer 'Class' - seit 2.3.22) verwendet und dann den Threadkontextklassenlader der Webanwendung übergibt. – ddekany

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

Mit dieser Methode kann die Klassen aus dem Paket zu laden, wo die Klasse befindet, so dass, wenn Ihre Klasse

org.foo.SomeClass die Vorlagen für den Classpath in /org/foo betrachtet werden. Dadurch werden Ihre Vorlagen in der Klasse gespeichert, die sie verwendet/lädt.

3

Im Jahr 2017 wird der folgende veraltet:

Configuration conf = new Configuration(); 

Wir freemarker.template.Version an den Konstruktor übergeben sollte:

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

wo die Versionsnummern beziehen sich auf die aktuelle Version von Freemarker.

Das Verzeichnis views befindet sich in src/main/resources.