遍历对象映射:Freemarker 中的列表

Posted

技术标签:

【中文标题】遍历对象映射:Freemarker 中的列表【英文标题】:Iterating over a map of Object: List in Freemarker 【发布时间】:2014-04-01 07:37:41 【问题描述】:

我正在尝试在 HashMap<SeapSubscription, List<PiNotice>> 上迭代 freemarker 模板。 该映射不包含任何空值(在键或值中)。

Freemarker中的代码是:

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

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

如果我从第二个列表中删除迭代()它一切正常(即迭代地图键,但是当我添加第二部分时,试图迭代地图-s 值,我得到一个空/缺失异常

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

==> subscriptionsWithPiNotices[s] [在模板“seap-subscription-newsletter.ftl”第 21 行第 16 列]

提示:如果已知失败的表达式合法地为空/缺失, 使用 myOptionalVar!myDefault 指定默认值,或使用 何时存在何时缺失。 (这些 只覆盖表达式的最后一步;覆盖整个 表达式,使用括号: (myOptionVar.foo)!myDefault, (myOptionVar.foo)??

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

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

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

【问题讨论】:

这是一个古老的 FTL 问题,它没有 Map 类型。它具有“哈希”类型,但仅支持 String 键(用于子变量)。然后BeansWrapper 默默地toString()-s s 因为[] 需要一个字符串,然后它当然找不到Map 条目......你会找到一些关于可能的解决方法的SO答案。 密钥的类型是什么? 【参考方案1】:

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

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

然后使用

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

【讨论】:

这个问题是你使用的是纯BeansWrapper,它有自己的缺点,而且这不适用于使用DefaultObjectWrapper(推荐)的设置。从 2.3.22 开始,您可以使用更好的解决方案,?api。请参阅this answer 或this FAQ entry。【参考方案2】:

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

【讨论】:

以上是关于遍历对象映射:Freemarker 中的列表的主要内容,如果未能解决你的问题,请参考以下文章

freemarker怎么遍历数组

如何从 Freemarker 中的模板数据映射对象递归打印数据?

freemarker如何遍历模板中所有变量

freemarker 遍历list去除重复值问题

freemarker中遍历一个list,得到指定的值 然后以逗号隔开

freemarker遍历map,注意 root.put("aa",map)