当前位置: 首页 > 知识库问答 >
问题:

FreeMarker:用哈希迭代嵌套列表

侯博易
2023-03-14

我想迭代嵌套在映射中的列表,数据结构如下所示:

Map<Integer, List<Integer>> groups = new TreeMap<>()
// Some code else to put values into groups ...

Freemarker模板:

<#list groups?keys as groupKey>
    ${groupKey}    // It's OK here.
    <#list groups[groupKey] as item>  // Exception threw here, detail message is pasted below
        ${item}
    </#list>
</#list>

详细异常消息:

FreeMarker模板错误:“...[...]”左操作数:需要序列或字符串或自动转换为字符串的东西(数字、日期或布尔值),但计算结果为extended_hash(包装器:f.t.simplehash):==>groups

那么,问题出在哪里呢?

附言。

我尝试了groups.get(groupKey)而不是groups[groupKey],它会抛出一个新的异常堆栈:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
java.lang.String.compareTo(String.java:108)
java.util.TreeMap.getEntry(TreeMap.java:346)
java.util.TreeMap.get(TreeMap.java:273)
freemarker.template.SimpleHash.get(SimpleHash.java:160)
freemarker.core.Dot._eval(Dot.java:40)
freemarker.core.Expression.eval(Expression.java:76)

共有1个答案

贺元明
2023-03-14

原始问题中的问题是FTL的哈希类型不像map。它是一个“变量”的集合,也就是说,键必须是string-s。(即使?keys工作也是Beanswrapper中的一个小故障...尽管现在它很方便。)由于键是一个数字,FTL假设您想要从序列(列表或数组)中获取一个项,或者您想要从字符串中获取一个字符,因此产生了原始的错误消息。

解决方案是使用Java API-s,就像dev-an的答案中的get一样。(从长远来看,FTL意味着引入map类型,所以所有这些非字符串键的问题都将结束,但谁知道什么时候会结束呢...)

更新:从2.3.22开始,就有了?API来访问对象的Java API,比如mymap?API.get(nonStringKey)。但是,默认情况下是不允许的(请参见api_builtin_enabled配置设置以及手册中的更多内容:http://freemarker.org/docs/ref_builtins_expert.html#ref_buitin_api_and_has_api)。还要注意,由于Java映射对数值类型有特殊要求,如果键不是来自Java的整数,则必须使用mymap?api.get(MyNumericalKey?int)

 类似资料:
  • 使用JSF 2.0,我需要显示一个表,其中每一行都包含一个打开弹出窗口的链接。我有两种型号:

  • 我的数据结构如下所示: Foo的每个实例都可以包含任意数量的S,这当然反过来又可以包含更多的S等等。那么,我该如何让FreeMarker通过这样的列表呢?

  • 本文向大家介绍Powershell使用嵌套哈希表实例 嵌套哈希表的2种写法例子,包括了Powershell使用嵌套哈希表实例 嵌套哈希表的2种写法例子的使用技巧和注意事项,需要的朋友参考一下 嵌套哈希表对于多维数组是一个更好选择。这种存储方式将更易于管理。请看: 也可以使用这种写法,也许更好: 脚本定义了一个用户,你可以查看一下这个用户的全部信息:   你将更容易获得里面单个信息:

  • 我试图用`stream,特别是嵌套的foreach循环,将以下代码重构为lambda表达式: 我的开头是:

  • 问题内容: Freemarker有两个集合数据类型,即列表和哈希图。有没有一种方法可以像对列表一样遍历哈希图键? 因此,如果我有一个带有数据的变量,则可以说: 我想用其值打印所有用户的属性。这是无效的,但目标很明确: 问题答案: 编辑: 不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其是不要使用。查看其他答案。 您使用内置的按键功能,例如,这应该可以工作:

  • 假设我有一个包含集合的对象,所述集合上的每个元素都包含一个集合,每个集合都包含一个集合。 我想在最深的对象上迭代,并对其应用相同的代码。 命令式的方法是微不足道的,但有没有一种方法来完成这一切? 我可以看到如何从最深的循环中生成lambda: 但我能做得更多吗?