我正在将 FMPP 转换集成到我们的 Java 代码库中。为此,我使用FMPP Java API。出于实际原因,我有两个单独的目录:
- 一个包含模板:
<absolute path template>/template.ftlx
- 一个包含数据:
<absolute path data>/data.xml
这在某种程度上使事情复杂化,因为我必须在这里使用绝对路径。通常,数据位于模板目录中(连同一个ignoredir.fmpp
文件)。但是,在我们的应用程序中,数据来自外部源(可通过 REST API 上传),而模板位于类路径中。这也意味着数据目录不是静态的。
我正在努力定义所有这些并通过 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
andSettings.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
。
如何将我的数据文件注入所有这些?它应该得到 key 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)
}
我所要做的就是通过 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 中做到这一点?