5

我有一个 java.lang.Iterable (实际上是一个 com.google.gson.JsonArray 实例)。

我想使用 freemarker (2.3.16) 枚举列表中的项目。

[#assign sports = controller.sports]
[#-- At this point, sports is bound to a com.google.gson.JsonArray instance. --]

[#list sports as sport]
  ${sport_index}
[/#list]

我想避免仅仅为了有一个明确的项目集合而编写一个自定义 bean 和 Gson 反序列化器。使用 Gson(它已经为我将 JSON 字符串反序列化为 JsonObject)然后从该 JsonObject 创建我自己的对象 DAG 对我来说似乎很浪费。

不幸的是,我还没有找到让 Freemarker 将 java.lang.Iterable 视为列表的方法。我得到:

freemarker.template.TemplateException : Expected collection or sequence.
  controller.sports evaluated instead to freemarker.ext.beans.XMLStringModel on line 8, column 16 in sports.html.
freemarker.core.TemplateObject.invalidTypeException(line:135)
freemarker.core.IteratorBlock$Context.runLoop(line:190)
freemarker.core.Environment.visit(line:417)
freemarker.core.IteratorBlock.accept(line:102)
freemarker.core.Environment.visit(line:210)
4

3 回答 3

5

显式循环迭代器应该可以工作,例如:

[#list sports.iterator() as sport]
   ${sport_index}
[/#list]
于 2011-05-31T21:32:29.640 回答
1

您所要做的就是将iterator()on your的结果添加JsonArray到上下文中。Freemarker 足够聪明,可以从那里处理它,您可以在模板中引用它,就像您执行任何其他类似列表的变量一样。

于 2011-05-31T18:24:52.770 回答
1

Freemarker 现在Iterable通过以下方式创建您的 freemarker 配置来支持 's:

configuration = new Configuration(VERSION_2_3_28);
DefaultObjectWrapper objectWrapper = new DefaultObjectWrapper(VERSION_2_3_28);
objectWrapper.setIterableSupport(true);
configuration.setObjectWrapper(objectWrapper);

并更新到 2.3.28 版本(我不确定是哪个版本添加了这个,但 .23 没有它),然后简单地实例化你Template传入的配置。

return new Template("somename", someReader, configuration);
于 2019-07-24T04:45:22.610 回答