variable parameter freemarker

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.