Настройка шаблона freemarker из пути к классам
У меня есть веб-приложение, которое мне нужно вручную получить шаблон Freemarker - шаблон получается через класс в проекте библиотеки, но фактический tpl файл содержится в пути класса веб-приложения. Итак, есть 2 проекта, один "taac-backend-api" и еще один "taac-web"; taac-backend-api имеет код для захвата шаблона и обработки его, но taac-web - это место, где хранится шаблон (в частности, в WEB-INF/classes/email/vendor.tpl). Я попробовал все: от использования springs classpath ресурс для использования метода Freemarkers setClassForTemplateLoading. Я предполагаю, что это сработает:
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl");
я всегда получаю исключение FileNotFoundException. Может ли кто-нибудь объяснить лучший способ получить шаблон из пути к классам?
Спасибо.
Ответы
Ответ 1
вот что у меня получилось:
freemarkerConfiguration = new Configuration(Configuration.VERSION_2_3_28);
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
Ответ 2
В 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
.
Ответ 3
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");
Используйте этот метод для загрузки классов из пакета, в котором находится ваш класс, поэтому, если ваш класс
org.foo.SomeClass
шаблоны будут искать в /org/foo
в пути к классам. Это сохраняет ваши шаблоны, хранящиеся в классе, который использует/загружает их.
Ответ 4
Если вы используете Struts 2 и плагин Conventions, решение wuntee не работает: setClassForTemplateLoading
в свою очередь создает экземпляр ClassTemplateLoader
, который не находит файлы в банках независимо от того, какой префикс пути указан.
Вместо этого создайте экземпляр StrutsClassTemplateLoader
. (Я делаю это в пользовательском подклассе FreemarkerManager
в методе getTemplateLoader
.) Он не принимает параметров, поэтому, по-видимому, он просто знает, как Struts и Conventions делают что-то.