1

それはすべてタイトルにあります。サンプルコントローラーで以下に示すように構築されたネストされたマップを解析しようとしています:

    def index() {

    Map<String, Object> motherMap = new HashMap<String, Object>()
    Map<String, String> childMap1 = new HashMap<String, String>()
    Map<String, String> childMap2 = new HashMap<String, String>()
    Map<String, String> childMap3 = new HashMap<String, String>()

    childMap1.put("cm1_key1", "cm1_value1")
    childMap1.put("cm1_key2", "cm1_value2")
    childMap1.put("cm1_key3", "cm1_value3")

    childMap2.put("cm2_key1", "cm2_value1")
    childMap2.put("cm2_key2", "cm2_value2")
    childMap2.put("cm2_key3", "cm2_value3")

    childMap3.put("cm3_key1", "cm3_value1")
    childMap3.put("cm3_key2", "cm3_value2")
    childMap3.put("cm3_key3", "cm3_value3")

    motherMap.put("mm_key1", childMap1)
    motherMap.put("mm_key2", childMap2)
    motherMap.put("mm_key3", childMap3)

    render (view: "thePage", model:[motherMap: motherMap])
}

GSP では、次のような childMaps 要素を取得しようとしています:

    ... html / gsp code ...
    <table>
        <g:each in="${motherMap.entrySet()}" var="entry">
            <g:if test="${entry.key != 'mm_key2'}">
                <g:each in="${entry.value.entrySet()}" var="childMap">
                    <tr>
                        <td>${childMap.key}</td>
                        <td>${childMap.value}</td>
                    </tr>
                </g:each>
            </g:if>
        </g:each>
    </table>
    ... html / gsp code ...

しかし、ページの処理中に例外が発生しました。はentry.value文字列として解釈されるため、 を呼び出すと.entrySet()例外が発生します。

GSP タグを使用して子マップのコンテンツを取得する方法はありますか?

編集:

@Sérgio Michels: Grails 1.3.7 と Groovy 1.7 (強制) を使用しています。

スタックトレースは次のとおりです。

    [ServiceBox] ERROR 2012-12-11 22-12-40 - Error processing GroovyPageView: No signature of method: java.lang.String.entrySet() is applicable for argument types: () values: []
    Possible solutions: getBytes(), every()
    groovy.lang.MissingMethodException: No signature of method: java.lang.String.entrySet() is applicable for argument types: () values: []
    Possible solutions: getBytes(), every()
        at F__SES_thePage_gsp$_run_closure2_closure3.doCall(thePage.gsp:54)
        at F__SES_thePage_gsp$_run_closure2.doCall(thePage.gsp:51)
        at F__SES_thePage_gsp$_run_closure2.doCall(thePage.gsp)
        at F__SES_thePage_gsp.run(thePage.gsp:65)
        at com.ircem.filter.CharsetFilter.doFilter(CharsetFilter.java:24)
        at java.lang.Thread.run(Thread.java:595)
    [ServiceBox] ERROR 2012-12-11 22-12-40 - Exception occurred when processing request: [GET] /ServiceBox/getthePage
    Stacktrace follows:
    org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: No signature of method: java.lang.String.entrySet() is applicable for argument types: () values: []
    Possible solutions: getBytes(), every()
        at com.ircem.filter.CharsetFilter.doFilter(CharsetFilter.java:24)
        at java.lang.Thread.run(Thread.java:595)
    Caused by: groovy.lang.MissingMethodException: No signature of method: java.lang.String.entrySet() is applicable for argument types: () values: []
    Possible solutions: getBytes(), every()
        at F__SES_thePage_gsp$_run_closure2_closure3.doCall(thePage.gsp:54)
        at F__SES_thePage_gsp$_run_closure2.doCall(thePage.gsp:51)
        at F__SES_thePage_gsp$_run_closure2.doCall(thePage.gsp)
        at F__SES_thePage_gsp.run(thePage.gsp:65)
        ... 2 more

@tim_yates:.entrySet()呼び出しを削除すると、 groovy.lang.MissingPropertyException: No such property: key for class: java.lang.String. コントローラーの HashMap は、ビューでは String として解釈されます。

再編集:

失敗は私のものでした。明示的なサニツェ操作を行っているときに、子マップを文字列に変換しました。正常に動作するようにループしXmap.entrySet()ます。ご迷惑おかけして申し訳ありません。Grails はバージョンに関係なく機能します

4

1 に答える 1

1

これを試して:

<g:each in="${motherMap}" var="motherMapEntry">
    <p>
    <g:if test="${motherMapEntry.key != 'mm_key2'}">
        <g:each in="${motherMapEntry.value}" var="entry">
            <p>${entry.key} -> ${entry.value}
        </g:each>
    </g:if>
</g:each>
于 2012-12-12T10:56:09.770 に答える