首页 > 解决方案 > 如何使用 FMPP Java API 动态加载数据?

问题描述

我正在将 FMPP 转换集成到我们的 Java 代码库中。为此,我使用FMPP Java API。出于实际原因,我有两个单独的目录:

这在某种程度上使事情复杂化,因为我必须在这里使用绝对路径。通常,数据位于模板目录中(连同一个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_DATAandSettings.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 中做到这一点?

标签: javafreemarkerfmpp

解决方案


推荐阅读