Tapestry循环遍历tml文件中的嵌套映射

Pra*_*tel 1 java loops tapestry list map

我有以下地图

Map<String, Map<String, Long>>
Run Code Online (Sandbox Code Playgroud)

可以通过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;
}
Run Code Online (Sandbox Code Playgroud)

因此,我转换 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>
Run Code Online (Sandbox Code Playgroud)

对应的java文件具有以下属性.

@Property
private Entry<String,Long> entry;
@Property
private Entry<String,Long> entry2;
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码.生成以下异常.

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

如果我在java文件中将属性entry2的类型更改为String,如下所示.....

@Property
private Entry<String,Long> entry;
@Property
private String entry2;
Run Code Online (Sandbox Code Playgroud)

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

然后我将整个列表呈现为单个字符串.

这意味着tapestry正在将其List<Entry<String, Long>>转换为String.我不希望这发生,因为我想遍历列表并访问单个条目.

如何循环这些嵌套的地图?有没有办法保留内部列表的类型,并阻止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>
Run Code Online (Sandbox Code Playgroud)

我有一个getter方法"KeySetForEntryValue",并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;
}
Run Code Online (Sandbox Code Playgroud)

以下是同一java类中的属性.

@Property
private Entry<String, Map<String, Long>> entry;
@Property
private Entry<String, Long> entry2;
Run Code Online (Sandbox Code Playgroud)

lan*_*ava 6

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

使用${...}模板中的属性促使值被强制为字符串

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