遍历对象映射: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 中的模板数据映射对象递归打印数据?