在Freemarker中将java.lang.Iterable视为#list表达式

|| 我有一个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)
    
已邀请:
        明确循环遍历迭代器应该可以工作,例如:
[#list sports.iterator() as sport]
   ${sport_index}
[/#list]
    
        您所要做的就是将
JsonArray
iterator()
的结果添加到上下文中。 Freemarker足够聪明,可以从那里进行处理,您可以像在其他任何类似列表的变量中一样在模板中引用它。     
        Freemarker现在通过以下方式创建您的freemarker配置来支持
Iterable
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);
    

要回复问题请先登录注册