【发布时间】:2014-02-27 01:33:22
【问题描述】:
我有以下地图
Map<String, Map<String, Long>>
此地图可通过java文件中的以下方法访问。
public List<Entry<String, List<Entry<String, Long>>>> getByEventTypeSorted() {
List<Entry<String, List<Entry<String, Long>>>> ret = new ArrayList<Entry<String, List<Entry<String, Long>>>>();
ret.addAll((Collection<? extends Entry<String, List<Entry<String, Long>>>>) byEventType.entrySet());
return ret;
}
因此,我将Map<String, Map<String, Long>> 转换为List<Entry<String, List<Entry<String, Long>>>> 并返回它。
现在,在我的 tml 文件中,我试图像这样循环遍历它。
<tr t:type="Loop" t:source="summarizer.byEventTypeSorted" t:value="entry">
<td style="border: 1px solid #EEEEEE; padding: 3px">${entry.key}</td>
<td style="border: 1px solid #EEEEEE; padding: 3px" t:type="Loop" t:source="${entry.value}" t:value="entry2">
${entry2.key}
</td>
</tr>
对应的java文件有以下属性。
@Property
private Entry<String,Long> entry;
@Property
private Entry<String,Long> entry2;
当我运行上面的代码时。产生以下异常。
Failure writing parameter 'value' of component ConceptSummaries:loop_1: Could not find a coercion from type java.lang.String to type java.util.Map$Entry.
如果我在 java 文件中将属性 entry2 的类型更改为字符串,如下所示.....
@Property
private Entry<String,Long> entry;
@Property
private String entry2;
然后在 tml 文件中循环,如下所示。
<tr t:type="Loop" t:source="summarizer.byEventTypeSorted" t:value="entry">
<td style="border: 1px solid #EEEEEE; padding: 3px">${entry.key}</td>
<td style="border: 1px solid #EEEEEE; padding: 3px" t:type="Loop" t:source="${entry.value}" t:value="entry2">
${entry2}
</td>
</tr>
然后我将整个列表呈现为单个字符串。
这意味着 Tapestry 正在将 List<Entry<String, Long>> 转换为字符串。
我不希望这种情况发生,因为我想遍历列表并访问各个条目。
如何循环遍历这些嵌套的地图?还有有什么办法可以保留inner list的类型,防止tapestry转成字符串?
更新: 我能够使用 Lance Java 的建议解决这个问题。以下是详细信息。
tml 文件中的代码。
<tr t:type="Loop" t:source="summarizer.byEventTypeSorted.entrySet()" t:value="entry">
<td style="border: 1px solid #EEEEEE; padding: 3px">${entry.key}</td>
<td style="border: 1px solid #EEEEEE; padding: 3px" t:type="Loop" t:source="KeySetForEntryValue" t:value="entry2">
${entry2.key}
</td>
</tr>
我在对应的 java 类中有 "KeySetForEntryValue" 和 Map<String, Map<String, Long>> 的 getter 方法。
public Set<Entry<String, Long>> getKeySetForEntryValue(){
return entry.getValue().entrySet();
}
public Map<String, Map<String, Long>> getByEventTypeSorted() {
return byEventType;
}
以下是同一个java类中的属性。
@Property
private Entry<String, Map<String, Long>> entry;
@Property
private Entry<String, Long> entry2;
【问题讨论】:
-
你不需要转换成
List,因为循环可以迭代java.util.Collection
标签: java list loops map tapestry