我正在尝试在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,是吗?
答案 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 answer或this FAQ entry。