在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来解决这个问题 - 我还没有在这里找到它)
答案 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
转为Iterator
或Collection
)。
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>