parameter - global variable freemarker
Establecer la plantilla de freemarker desde classpath (4)
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 clase 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:
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl");
sin embargo, siempre obtengo una excepción FileNotFoundException. ¿Alguien puede explicar la mejor manera de obtener una plantilla del classpath?
Gracias.
En 2017, lo siguiente está en desuso:
Configuration conf = new Configuration();
Deberíamos 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 de views
se encuentra en src/main/resources
.
Si está utilizando Struts 2 y el complemento Conventions, la solución de wuntee no parece funcionar: setClassForTemplateLoading
a su vez crea una instancia de ClassTemplateLoader
que no encuentra archivos en jar sin importar el path prefix que se especifique.
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.
esto es lo que terminó trabajando para mí:
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");
Use este método para cargar las clases del paquete donde está ubicada su clase, de modo que si su clase es
org.foo.SomeClass
las plantillas se buscarán en /org/foo
en classpath. Esto mantiene tus plantillas almacenadas con la clase que las usa / carga.