2010-06-11 4 views
29

Ho un'applicazione Web che è necessario ottenere manualmente un modello di Freemarker: il modello viene ottenuto tramite una classe in un progetto di libreria, ma il file tpl effettivo è contenuto nel classpath dell'applicazione Web. Quindi, ci sono 2 progetti, uno 'taac-backend-api' e un altro 'taac-web'; taac-backend-api ha il codice per prendere il template e processarlo, ma taac-web è dove il template è memorizzato (in particolare in: WEB-INF/classes/email/vendor.tpl) - Ho provato tutto dall'uso molla la risorsa classpath nell'utilizzo del metodo Freemarkers setClassForTemplateLoading. Presumo che ciò potrebbe funzionare:Impostazione del modello di venditore da classpath

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

ancora, ottengo sempre un FileNotFoundException. Qualcuno può spiegare il modo migliore per ottenere un modello dal classpath?

Grazie.

risposta

71

questo è ciò che ha finito per lavorare per me:

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

Se si utilizza Struts 2 e il plugin convenzioni, la soluzione di wuntee non sembra funzionare: setClassForTemplateLoading a sua volta crea un'istanza di ClassTemplateLoader che doesn trovare i file nei barattoli, indipendentemente dal prefisso del percorso specificato.

Invece, creare un'istanza di StrutsClassTemplateLoader. (Lo faccio in una sottoclasse personalizzata di FreemarkerManager nel suo metodo getTemplateLoader.) Non richiede parametri, quindi presumibilmente sa solo come Struts e Conventions fanno le cose.

+0

A seconda della gerarchia del programma di caricamento classe, a volte è necessario considerare attentamente la classe specificata per "ClassTemplateLoader". Spesso la cosa migliore è usare il costruttore 'ClassTemplateLoader' che prende direttamente un' ClassLoader' (invece di un 'Class' - dal 2.3.22), e poi passa nel caricatore di classi del contesto del thread dell'applicazione web. – ddekany

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

Utilizzare questo metodo per caricare le classi del pacchetto in cui si trova la classe, quindi se la classe è

org.foo.SomeClass i modelli sarà cercato in /org/foo nel classpath. Ciò mantiene i tuoi modelli memorizzati con la classe che li usa/li carica.

3

Nel 2017, è deprecato quanto segue:

Configuration conf = new Configuration(); 

Dovremmo passare freemarker.template.Version al costruttore:

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

in cui i numeri di versione si riferiscono alla versione corrente di FreeMarker.

La directory views si trova in src/main/resources.