< #list>中的Iterable的FreeMarker错误

时间:2017-09-23 04:49:41

标签: freemarker

在FreeMarker模板中,我将变量传递给<#list>

<#list sectorTags as sector>
     <td colspan="${sector.designatedTags!?size}">${sector.name}</td>
<#else>
     <td>No technology sectors defined.</td>
</#list>

但是失败了:

06:25:03,733 SEVERE freemarker.core.NonSequenceOrCollectionException: Expected a sequence or collection, but this has evaluated to an extended_hash+string (com.tinkerpop.frames.structures.FramedVertexIterable wrapped into f.e.b.StringModel):
==> sectorTags  [in template "reports/templates/techReport-punchCard.ftl" at line 105, column 32]
----
FTL stack trace ("~" means nesting-related):
    - Failed at: #list-#else-container  [in template "reports/templates/techReport-punchCard.ftl" at line 105, column 25]
----
    at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:295)
...

发生了什么?

(如果其他人碰到了问题,我会用Q&amp; A来解决这个问题 - 我还没有在这里找到它)

3 个答案:

答案 0 :(得分:2)

您需要启用Iterable支持。默认情况下,它是向后兼容的。您也可以升级FreeMarer,至少在当前版本中,错误消息还包含:

  

提示:有问题的值是java.lang.Iterable。运用   DefaultObjectWrapper(...,iterableSupport = true)作为object_wrapper   设置FreeMarker配置应该解决这个问题。

当您使用Java API配置FreeMarker时,看起来像这样:

DefaultObjectWrapperBuilder owb = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_26);
owb.setIterableSupport(true);
cfg.setObjectWrapper(owb.build());

答案 1 :(得分:0)

这里的问题是变量是Iterable。 FreeMarker目前无法处理(即将Iterable转为IteratorCollection)。

Iterable必须明确地转换为Iterator

<#list sectorTags.iterator() as sector>
     <td colspan="${sector.designatedTags!.iterator()?size}">${sector.name}</td>
<#else>
     <td>No technology sectors defined.</td>
</#list>

Jira问题(我现在找不到)中讨论了Iteratable未自动转换的原因。如果我没记错的话,那是因为Java中的某些类型是Iterable但是不希望自动将它们变成Iterators

答案 2 :(得分:0)

春季示例

在控制器中

model.addAttribute("blogItems", blogItems);
return "main";

在模板中

<#list blogItems.iterator() as blogItem>
   ${blogItem.name}
</#list>