2010-06-11 17 views
29

Tengo una aplicación web que necesito obtener manualmente una plantilla de Freemarker: la plantilla se obtiene a través de una clase en un proyecto de biblioteca, pero el archivo tpl real está contenido en la ruta de clases de la aplicación web. Entonces, hay 2 proyectos, uno 'taac-backend-api' y otro 'taac-web'; taac-backend-api tiene el código para tomar la plantilla y procesarla, pero taac-web es donde se almacena la plantilla (específicamente en: WEB-INF/classes/email/vendor.tpl) - He intentado todo desde el uso springs recurso de classpath para utilizar Freemarkers setClassForTemplateLoading método. Supongo que esto funcionaría:Configuración de la plantilla freemarker de classpath

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

todavía, siempre obtengo una excepción FileNotFoundException. ¿Alguien puede explicar la mejor manera de obtener una plantilla del classpath?

Gracias.

Respuesta

71

esto es lo que terminó trabajando para mí:

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

Si está utilizando Struts 2 y el complemento de los convenios, no parece la solución de wuntee a trabajar: setClassForTemplateLoading a su vez crea una instancia de ClassTemplateLoader la que doesn No encuentro archivos en frascos, independientemente de la ruta especificada en el prefijo.

En su lugar, cree una instancia de StrutsClassTemplateLoader. (Lo hago en una subclase personalizada de FreemarkerManager en su método getTemplateLoader). No requiere parámetros, por lo que presumiblemente solo sabe cómo Struts y Conventions hacen cosas.

+0

Dependiendo de la jerarquía del cargador de clases, a veces se debe considerar cuidadosamente qué clase se especifica para 'ClassTemplateLoader'. A menudo, lo mejor es utilizar el constructor 'ClassTemplateLoader' que toma' ClassLoader' directamente (en lugar de 'Class' - desde 2.3.22), y luego pasa el cargador de clases de contexto de subprocesos de la aplicación web. – ddekany

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

Utilice este método para cargar las clases del paquete donde se encuentra su clase, así que si su clase es

org.foo.SomeClass las plantillas se buscó en /org/foo en la ruta de clase. Esto mantiene tus plantillas almacenadas con la clase que las usa/carga.

3

En 2017, es obsoleto lo siguiente:

Configuration conf = new Configuration(); 

Debemos pasar freemarker.template.Version al constructor:

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

donde los números de versión se refieren a la versión actual de FreeMarker.

El directorio views se encuentra en src/main/resources.

Cuestiones relacionadas