迭代Object的地图:Freemarker中的List

时间:2014-02-28 10:43:24

标签: freemarker

我正在尝试在HashMap<SeapSubscription, List<PiNotice>>上迭代自由标记模板。 地图不包含任何空值(在键或值中)。

Freemarker中的代码是:

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

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

如果我从第二个列表中删除迭代(&lt; #list subscriptionsWithPiNotices [s]为piNotice&gt;),那一切都有效(即迭代地图键,但是当我添加第二部分时,尝试迭代map-s值,我得到一个空/缺少异常

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

==&GT; subscriptionsWithPiNotices [s] [在模板“seap-subscription-newsletter.ftl”第21行,第16栏]

     

提示:如果已知失败的表达式在法律上为空/缺失,   使用myOptionalVar!myDefault指定默认值,或使用   &lt; #if myOptionalVar ??&gt; when-present&lt;#else&gt; when-missing。 (这些   只涵盖表达的最后一步;覆盖整体   表达式,使用parenthessis:(myOptionVar.foo)!myDefault,   (myOptionVar.foo)...

     

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

     

==&GT; #list subscriptionsWithPiNotices [s] a ... [在模板“seap-subscription-newsletter.ftl”第21行第9栏]       #list subscriptionsWithPiNotices?keys ... [在模板“seap-subscription-newsletter.ftl”第18行第5列]

我再说一遍,我抛弃了那个HashMap,它只有一个键,一个ArrayList里面有一个项目。所以没有理由报告null,是吗?

2 个答案:

答案 0 :(得分:0)

最后,我设法通过配置

解决了这个问题
BeansWrapper bw = BeansWrapper.getDefaultInstance();
bw.setSimpleMapWrapper(true);
cfg.setObjectWrapper(bw);

然后使用

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

答案 1 :(得分:0)

所以这是[]运算符only supports string keys的旧问题。从2.3.22开始,您可以使用someMap?api.get(someNonStringKey)来解决这个问题。它需要一些配置才能启用,但不会破坏现有应用程序。请参阅this answerthis FAQ entry