2014-12-03 221 views
4

嵌套列表我想要遍历嵌套在地图列表,数据结构是这样的:Freemarker的:迭代哈希

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 template error: For "...[...]" left-hand operand: Expected a sequence or string or something automatically convertible to string (number, date or boolean), but this evaluated to an extended_hash (wrapper: f.t.SimpleHash): ==> groups

那么,这是什么问题?

P.S.

我已经试过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) 

回答

6

在原来的问题,问题是FTL的哈希类型不喜欢Map。它是一组“变量”,即密钥必须是String-s。 (即使?keys的作品在BeansWrapper中也是一个小故障......尽管现在它很方便。)由于密钥是一个数字,FTL假定你想从序列中获得一个项目(一个List或数组),或者你想要的从字符串中获取一个字符,从而得到原始的错误信息。

该解决方案使用Java API-s,如Dev-an的回答中的get。 (在长期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地图特别针对数字类型,如果密钥不是来自Java的Integer,则必须使用myMap?api.get(myNumericalKey?int)

+0

是的,你说得对,我把'groupKey'的类型从'Integer'改成了'String',并且工作。 – 2014-12-05 06:44:18

+0

那么解决方案是什么?我有同样的问题,无法赶上你的解决方案。 – 2016-05-06 20:15:48

+0

@Mohy:你什么意思? '?api'由于某种原因不起作用? – ddekany 2016-05-06 21:00:00

1

尝试以下操作:

<#list groups?keys as groupKey> 
    ${groupKey} 
    <#list groups.get(groupKey) as item> 
     ${item} 
    </#list> 
</#list> 
+2

我试过这个,它显示了另一个异常:'嵌套异常是java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.String'。我不知道这个演员发生在哪里。 – 2014-12-03 06:00:34

+0

它出现在'TreeMap'里面,就像堆栈跟踪显示的那样。你在那个'TreeMap'的某个地方没有'String'键吗? – ddekany 2014-12-03 20:15:45

+1

也许FTL将'groupKey'当作一个String键并抛出这个异常。最后,在将'groups'类型更改为'Map >'后,它工作。 – 2014-12-05 06:43:29