【问题标题】:Iterating over a map of Object: List in Freemarker遍历对象映射: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答案。
  • 密钥的类型是什么?

标签: freemarker


【解决方案1】:

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

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

然后使用

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 2020-08-19
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多