使用 FreeMarker 获取大对象

Getting big objects with FreeMarker

我认为如果模板设计者能够从给定对象访问他想要的所有字段,那就太好了。所以在 java 而不是:

Map<String, Object> fields = new HashMap<>();
fields.add("x", unit.getX());
fields.add("y", unit.getY());
fields.add("z", unit.getZ());
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("unit", fields);

我可以做到:

Map<String, Object> dataModel = new HashMap<>();
dataModel.put("unit", unit);

并且 ftl 设计器有可能以某种方式访问​​单元的 x、y 和 z。

所以我有两个问题: 1、如何访问ftl文件中Unit对象的字段? 2. ftl designer怎么知道,他可以使用哪些可能的字段?

到目前为止,我已经提出了要使用反射的第 1 点。单元 class 正在实现 TemplateHashModel,在 get(String) 中,我让它按名称查找字段,然后将值解析为 SimpleScalarSimpleNumber 或其他 TemplateHashModel.这是一个好的解决方案吗?

关于问题1,默认情况下是这样的。您只需执行 dataModel.put("unit", unit),其中 unit 是一个 Unit 对象,并且从模板 unit.x 等应该可以工作。如果不是,那么可能 Unit 或 getter 方法不是 public,或者您正在使用一些非默认的限制性 object_wrapper 配置设置。 (或者,问题可能是 Unit 实现了 MapList 或 FreeMarker 特别处理的其他接口。)

关于问题2,数据模型内容是模板(MVC View)和系统其他部分之间的契约,所以理想情况下,它必须由你记录在某个地方。自动生成此类文档超出了 FreeMarker 的范围,因为模板的数据模型内容可能会根据各种条件而变化,因此通常无法自动发现。但是,在某些应用程序中,可以从变量的 Java classes(如 Unit)生成信息。至于存在哪些顶级变量 ("unit") 以及它们的 class 是什么,数据模型本身可以是模板特定 class 的 Java 对象,而不是 Map,因此整个数据模型由 Java classes.

指定