java - Tapestry 循环遍历 tml 文件中的嵌套 map

标签 java list loops dictionary tapestry

我有如下 map

Map<String, Map<String, Long>>

此 map 可通过 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 的类型更改为 String,如下所示......

@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>>成一个字符串。 我不希望发生这种情况,因为我想遍历列表并访问各个条目。

如何循环遍历这些嵌套的 map ?有没有办法保留内部列表的类型并防止 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>

我有一个 "KeySetForEntryValue" 的 getter 方法和 Map<String, Map<String, Long>>在相应的 java 类中。

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;

最佳答案

你的问题是 t:source="${entry.value}"

在模板属性中使用 ${...} 会导致值为 coerced到一个字符串

请尝试使用 t:source="entry.value"

这是我的做法:

@Property
private Map<String, Map<String, Long>> byEventType;

@Property
private Entry<String, Map<String, Long>> entry;

@Property
private Entry<String, Long> entry2;

<tr t:type="Loop" t:source="byEventType.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="entry.value.entrySet()" t:value="entry2"> 
    ${entry2.key} = ${entry2.value}
</td>

关于java - Tapestry 循环遍历 tml 文件中的嵌套 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21529489/

相关文章:

java - 具有多个按钮和不同 id 的 CustomView 监听器(回调)

c++ - 如何在 C++ 中用列表初始化对象?

Python-将许多列表字典添加到持久主字典时的性能

list - Haskell 从给定的输入创建一个 n 元组

javascript - jQuery 迭代嵌套 html 列表

java - Xpath - 问题,使用 Firebug 检测元素

java - JTreeTable DnD 疯狂闪烁的下降光标

java - 如何在 Jtree 中刷新 XML

javascript - 迭代 javascript map

javascript - 来自数组 javascript 的源