Freemarker:在哈希中迭代嵌套列表

pat*_*ide 7 java freemarker java-ee

我想迭代嵌套在Map中的List,数据结构如下:

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

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>
Run Code Online (Sandbox Code Playgroud)

详细异常消息:

FreeMarker模板错误:对于"... [...]"左手操作数:预期序列或字符串或其他东西可自动转换为字符串(数字,日期或布尔值),但这被评估为extended_hash(包装器:ftSimpleHash) :==>组

那么,问题是什么?

PS

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

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)
Run Code Online (Sandbox Code Playgroud)

dde*_*any 7

原始问题中的问题是FTL的哈希类型不像Map.它是"变量"的集合,也就是说,键必须是String-s.(即使这样的?keys工作也是一个小问题BeansWrapper......虽然它现在很方便.)因为键是一个数字,FTL假定你想要从序列(a List或数组)中获取一个项目,或者你想得到一个字符串中的字符,因此是原始错误消息.

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

更新:从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映射特别关注数字类型,因此如果密钥不是Integer来自Java,则必须使用myMap?api.get(myNumericalKey?int).