簡體   English   中英

Tapestry通過tml文件中的嵌套映射循環

[英]Tapestry loop through nested map in tml file

我有以下地圖

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的類型更改為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>

然后,我將整個列表呈現為單個字符串。

這意味着掛毯正在將List<Entry<String, Long>>轉換為字符串。 我不希望發生這種情況,因為我想遍歷列表並訪問各個條目。

如何遍歷這些嵌套地圖? 還有什么方法可以保留內部列表的類型並防止掛毯將其轉換為字符串?

更新:我能夠使用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;

您的問題出在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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM