Freemarker: как использовать Multimap (или Карта списков) - PullRequest
4 голосов
/ 26 октября 2011

Я пытаюсь использовать com.google.common.collect.Multimap от Freemarker.

В мультикарте для каждого ключа на карте вы получаете коллекцию.

Я попробовал следующее, но это не сработало:

Java:

context.put("itemsByCategory", itemsByCategory);

FreeMarker:

<#list exclusiveItems?keys as cat>
    ${cat}<br/>
    <#assign items = exclusiveItems[cat]>
    <#list items as item>
        ${item.id}
    </#list>
</#list>

Я получил следующее исключение.Похоже, что он рассматривает Предметы как скаляр, хотя на самом деле это Коллекция.

?size is unsupported for: freemarker.ext.beans.SimpleMethodModel
The problematic instruction:
----------
==> list items as item [on line 61, column 49 in email/foo/foo-html.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateModelException: ?size is unsupportefor:freemarker.ext.beans.SimpleMethodModel

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Я нашел решение, которое работает.

Вместо передачи экземпляра Multimap ("itemsByCategory"), как в примере, я обнаружил, что преобразование Multimap в необработанную карту> и затем использование этого работаетс приведенным выше фрагментом FreeMarker.

Надеюсь, это кому-нибудь поможет.

1 голос
/ 26 октября 2011

Вы говорите, что оно рассматривает значение как скаляр, но кажется, что оно обрабатывает его как метод.Что если вы просто перечислите ключи?Нет ли среди них имен методов?Потому что тогда ваша проблема, скорее всего, заключается в том, что вы не установили свойство simpleMapWrapper JavaBean BeansWrapper, которое вы используете, на true.

0 голосов
/ 26 октября 2011

Вы должны посмотреть на keySet и asMap.

Метод keys даст набор ключей, которые могут (вероятно, будут) содержать дубликаты. Это возвращает ключ для каждого значения, даже если ключ используется дважды. keySet дает список уникальных ключей.

...