Подтвердить что ты не робот

Настройка шаблона 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. Может ли кто-нибудь объяснить лучший способ получить шаблон из пути к классам?

Спасибо.

4b9b3361

Ответ 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 делают что-то.