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



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

Freemarker中的代码是:

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

如果我从第二个列表中删除迭代(<#list-subscriptionsWithPiNotices[s]as piNotice>),它都可以工作(即在映射键上迭代,但当我添加第二部分,尝试在映射值上迭代时,我会得到一个空/缺失异常

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

===>subscriptionsWithPiNotices[s][in template"seap-subscription-e时事通讯.ftl"at line 21,column 16]

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

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

===>#list subscriptionsWithPiNotices[s]a…[在模板"sea subscription newsletter.ftl"第21行第9列]#用PiNotices列出订阅?键。。。[在第18行第5栏的模板"seap订阅时事通讯.ftl"中]

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

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

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

然后使用

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

所以这是[]运算符只支持字符串键的老问题。从2.3.22开始,您可以使用someMap?api.get(someNonStringKey)来解决此问题。它需要一些配置才能启用,但不会破坏现有的应用程序。请参阅此答案或此常见问题条目。

最新更新