2014-02-28 22 views
0

我试图通过HashMap<SeapSubscription, List<PiNotice>>在freemarker模板中进行迭代。 该地图不包含任何空值(按键或值)。迭代对象的映射:Freemarker中的列表

在Freemarker的代码是:

<#list subscriptionsWithPiNotices?keys as s> 
${s.title} 

    <#list subscriptionsWithPiNotices[s] as piNotice> 
    Autoritate contractanta: ${piNotice.contractingAuthorityName} 
    . 
    . 
    </#list> 
</#list> 

如果我从第二列表(< #list subscriptionsWithPiNotices [秒]作为piNotice>)所有的工作除去迭代(即遍历映射键,但是当我添加第二个部分,试图遍历地图的价值,我得到一个空/缺失异常

      FreeMarker template error: The following has evaluated to null or missing: 

==> subscriptionsWithPiNotices [S] [模板“SEAP订阅快讯.ftl”在第21行,第16栏第]

提示:如果发生故障的表达已知是合法空/缺少, 要么指定与myOptionalVar myDefault的默认值,或使用 <的#if myOptionalVar ??>时,本! < #else>失踪时。 (这些 仅覆盖表达的最后步骤;以覆盖整个 表达,使用parenthessis:(myOptionVar.foo)myDefault, (myOptionVar.foo)??

的失败指令(FTL堆栈跟踪)! :

==> #list subscriptionsWithPiNotices [s] a ... [在模板“seap-subscription-newsletter.ftl”第21行,第9列] #list subscriptionsWithPiNotices?keys ... [in template“ seap-subscription-newsletter.ftl“在第18行第5列]

我再说一遍, hMap,它只有一个关键字,其中一个ArrayList里面有一个项目。所以没有理由报告一个空,是吗?

+0

这是FTL的年龄问题,它没有'Map'类型。它有一个“散列”类型,但只支持“字符串”键(用于子变量)。然后'BeansWrapper'静静地将'toString()'s's'作为'[]'需要一个字符串,然后它当然不会找到'Map'条目......你会发现一些关于可能的SO答案解决方法。 – ddekany

+0

密钥的类型是什么? –

回答

0

最后我设法解决这个问题,通过配置

BeansWrapper bw = BeansWrapper.getDefaultInstance(); 
bw.setSimpleMapWrapper(true); 
cfg.setObjectWrapper(bw); 

,然后使用

地图(key)的语法,而不是图[键]或map.key。它似乎适用于任何类型的密钥类。

+0

这个问题是,你使用纯粹的'BeansWrapper',它有自己的疣,也不会在使用'DefaultObjectWrapper'(推荐)的设置上工作。从2.3.22开始,你可以使用更好的解决方案''api'。请参阅[本答案](http://stackoverflow.com/a/28794648/606679)或[本FAQ条目](http://freemarker.org/docs/app_faq.html#faq_nonstring_keys)。 – ddekany