2017-09-23 94 views
0

在Freemarker模板,我通过一个变量来<#list>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 &一个,如果别人跑进 - 我还没有发现它在这里)

回答

2

您需要对Iterable支持。为了向后兼容,它默认关闭。您可能还应该升级FreeMarer,至少在当前版本中,错误消息中还包含以下内容:

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

,当你FreeMarker的配置使用Java API看起来是这样的:

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

有关参考,请参阅[Iterable support PR](https://github.com/apache/incubator-freemarker/commit/f084603d7d9f76ae5bf0536d2ac6af2041a8db5d) –

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> 

之所以Iteratable不会自动coverted在JIRA问题进行了讨论(我现在不能找到)。如果我没有记错,那是因为Java中有一些类型为Iterable,但不希望自动将它们变成Iterators

+0

只是为了后来的读者着想,FreeMarker的不支持上市'Iterable'-S直接(无需转换)。这是一个配置问题;看到我的答案更多。 – ddekany