Я интегрирую преобразование FMPP в нашу кодовую базу Java.Для этого я использую FMPP Java API .Из практических соображений у меня есть два отдельных каталога:
- , который содержит шаблон:
<absolute path template>/template.ftlx
- , который содержит данные:
<absolute path data>/data.xml
Это как-то усложняет ситуацию, так как здесь я должен работать с абсолютными путями.Обычно данные находятся в каталоге шаблона (вместе с файлом ignoredir.fmpp
).Однако в нашем приложении данные поступают из внешнего источника (его можно загрузить через API REST), а шаблон находится в пути к классам.Это также означает, что каталог данных не является статичным.
Я изо всех сил пытаюсь определить все это и получить преобразование, происходящее через Java API.В настоящее время у меня есть следующее:
Settings s = new Settings(new File("."));
s.set(Settings.NAME_SOURCES, new File("<absolute path template>/template.ftlx").getAbsolutePath());
s.set(Settings.NAME_OUTPUT_FILE, new File("<absolute path output>/output.xml").getAbsolutePath());
s.execute();
Приведенный выше фрагмент кода не является полным, так как я должен добавить данные.Есть свойства Settings.NAME_DATA
и Settings.NAME_DATA_ROOT
, но я не могу заставить их работать.Я попытался установить Settings.NAME_DATA_ROOT
следующим образом:
s.set(Settings.NAME_DATA_ROOT, new File("<absolute path data>").getAbsolutePath());
Затем я получаю исключение, что FreeMarker не может найти мои данные:
The following has evaluated to null or missing:
==> d [in template "template.ftlx" at line 4, column 12]
В шаблоне я просто делаю:
<#list d.items>...</#list>
Это имеет смысл, что это не будет работать, поскольку я нигде не определил, что данные должны быть доступны через хеш d.
(что я делаю ниже в config.fmpp
).Но я не знаю, как правильно определить это через Settings.NAME_DATA
и / или Settings.NAME_DATA_ROOT
.
Как я могу внедрить мой файл данных во все это?Он должен получить ключ d
, поэтому я могу сослаться на d.
в шаблоне.
ссылка
Так же, как ссылка, если я создам следующее config.fmpp
файл в <absolute path config>
, поместите файл данных data.xml
в каталог <absolute path data>
и вызовите s.load(new File("<absolute path config>/config.fmpp"))
до s.execute()
выше, все работает нормально.
data: {
d: xml(<absolute path data>/data.xml)
}
Все, что мне нужно понятьOut делает это динамически через Java API.Я не могу использовать config.fmpp
для этого, так как расположение данных не статично (и, насколько я знаю, config.fmpp
не параметризуемо).
рабочее решение, с сомнениями
После некоторого чтения кода я получаю его, если я сделаю следующее:
Settings s = new Settings(new File("."));
s.set(Settings.NAME_SOURCES, new File("<absolute path template>/template.ftlx").getAbsolutePath());
s.set(Settings.NAME_OUTPUT_FILE, new File("<absolute path output>/output.xml").getAbsolutePath());
s.set(Settings.NAME_DATA, "{d:xml(<absolute path output>/data.xml)}");
s.execute();
Здесь мы передаем {configuration:xml(<absolute path output>/data.xml)}
как TDD свойству NAME_DATA
.Это путь?Это «странно» - создавать текстовое определение в нашем коде.Есть ли способ сделать это на чистой Java?