在Freemarker中的Object:List映射上迭代

在Freemarker中的Object:List映射上迭代,freemarker,Freemarker,我试图在一个HashMap上迭代freemarker模板。 映射的键或值中不包含任何空值 Freemarker中的代码是: <#list subscriptionsWithPiNotices?keys as s> ${s.title} <#list subscriptionsWithPiNotices[s] as piNotice> Autoritate contractanta: ${piNotice.contractingAuthorityNam

我试图在一个HashMap上迭代freemarker模板。 映射的键或值中不包含任何空值

Freemarker中的代码是:

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

    <#list subscriptionsWithPiNotices[s] as piNotice>
    Autoritate contractanta: ${piNotice.contractingAuthorityName}
    .
    .
    </#list>
</#list>
==>使用Pinotices[s]订阅[在第21行第16列的模板seap-subscription-newsletter.ftl中]

提示:如果已知失败的表达式在法律上为空/缺失, 使用myOptionalVar指定默认值!myDefault,或使用 当出现时,当丢失时。这些 只覆盖表达式的最后一步;包罗万象 表达式,使用括号:myOptionVar.foo!我的默认, myOptionVar.foo

失败的指令FTL堆栈跟踪:

==>列出带有Pinotice[s]的订阅。。。[模板seap-subscription-newsletter.ftl第21行第9列] 使用Pinotices?键列出订阅。。。[模板seap-subscription-newsletter.ftl第18行第5列]


我重复一遍,我转储了HashMap,它只有一个键,一个ArrayList中有一个项。所以没有理由报告空值,是吗?

最后,我通过配置

BeansWrapper bw = BeansWrapper.getDefaultInstance();
bw.setSimpleMapWrapper(true);
cfg.setObjectWrapper(bw);
然后使用


mapkey语法,而不是map[key]或map.key。它似乎适用于任何类型的键类。

因此这是[]运算符遇到的老问题。从2.3.22开始,您可以使用someMap?api.getsomeNonStringKey来解决这个问题。它需要一些配置才能启用,但不会破坏现有应用程序。请参阅或。

这是一个由来已久的FTL问题,它没有地图类型。它有一个哈希类型,但只支持子变量的字符串键。然后BeansWrapper静默地将字符串s作为[]需要一个字符串,然后它当然找不到映射项。。。关于可能的解决方法,您会找到一些答案。密钥的类型是什么?问题是,您使用的是纯BeansWrapper,它有自己的缺点,而且在使用DefaultObjectWapper的设置上也不起作用。由于2.3.22,您可以使用更好的解决方案??api。看到或看到。
BeansWrapper bw = BeansWrapper.getDefaultInstance();
bw.setSimpleMapWrapper(true);
cfg.setObjectWrapper(bw);