Установка шаблона freemarker из пути к классам

У меня есть веб-приложение, которое мне нужно вручную получить шаблон Freemarker — шаблон получен через класс в библиотечном проекте, но фактический файл tpl содержится в пути к классам веб-приложения. Итак, есть 2 проекта: один «taac-backend-api» и другой «taac-web»; taac-backend-api имеет код для захвата шаблона и его обработки, но taac-web — это место, где хранится шаблон (в частности, в: WEB-INF/classes/email/vendor.tpl) — я пробовал все, от использования передает ресурс пути к классам с помощью метода Freemarkers setClassForTemplateLoading. Я предполагаю, что это сработает:

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

тем не менее, я всегда получаю исключение FileNotFoundException. Может ли кто-нибудь объяснить, как лучше всего получить шаблон из пути к классам?

Спасибо.


person wuntee    schedule 11.06.2010    source источник


Ответы (5)


это то, что в итоге сработало для меня:

freemarkerConfiguration = new Configuration(Configuration.VERSION_2_3_28);
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
person wuntee    schedule 11.06.2010
comment
Пожалуйста, где должен быть email/vendor.tpl? - person Salem loress; 18.04.2021

В 2017 году устарело следующее:

Configuration conf = new Configuration();

Мы должны передать freemarker.template.Version конструктору:

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

где номера версий относятся к текущей версии FreeMarker.

Каталог views находится в src/main/resources.

person Jan Bodnar    schedule 05.03.2017

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

Используйте этот метод для загрузки классов из пакета, в котором находится ваш класс, поэтому, если ваш класс

org.foo.SomeClass шаблоны будут искать в /org/foo пути к классам. Это сохраняет ваши шаблоны в классе, который их использует/загружает.

person WizardsOfWor    schedule 16.10.2013
comment
Но если я хочу сохранить шаблон в папке ресурсов/шаблонов, как я могу это сделать? - person Aromal; 15.11.2018
comment
@Aromal нашел какие-нибудь решения для этого? - person Ijaz; 23.06.2020

Если вы используете Struts 2 и плагин Conventions, решение wuntee, похоже, не работает: setClassForTemplateLoading, в свою очередь, создает экземпляр ClassTemplateLoader, который не находит файлы в банках независимо от того, какой префикс пути указан.

Вместо этого создайте экземпляр StrutsClassTemplateLoader. (Я делаю это в пользовательском подклассе FreemarkerManager в его методе getTemplateLoader.) Он не принимает параметров, поэтому, по-видимому, он просто знает, как работают Struts и Conventions.

person Rodney Gitzel    schedule 27.05.2011
comment
В зависимости от иерархии загрузчика классов иногда необходимо тщательно продумать, какой класс вы указываете для ClassTemplateLoader. Часто лучше всего использовать конструктор ClassTemplateLoader, который принимает ClassLoader напрямую (вместо Class - начиная с 2.3.22), а затем передает загрузчик класса контекста потока веб-приложения. - person ddekany; 14.03.2015

Используйте следующую конфигурацию и поместите ее в свойства приложения.

spring.freemarker.template-loader-path=
person Artjom Prozorov    schedule 24.05.2020