Запретить FreeMarker обернуть класс, реализующий Collection, в SimpleSequence - PullRequest
1 голос
/ 20 августа 2010

У меня есть класс Page, реализующий java.util.Collection, а также другие методы, такие как hasPreviousPage, getTotalPages и т. Д. Freemarker переносит этот класс в SimpleSequence. Это скроет методы, не являющиеся частью java.util.Collection.

т.е. когда я пишу ${page.getTotalPages()} я получил эту ошибку:

Ожидаемый хеш. myPage вместо этого оценивается как freemarker.template.SimpleSequence [...]

Как я могу сказать Freemarker выставить оба метода для итерации по Collection , чтобы код, такой как <#list page as item>, продолжал работать, и пользовательские?

Спасибо за любое предложение / ссылку.

Ответы [ 2 ]

3 голосов
/ 23 августа 2010

Две мысли, хотя ни одна из них не отвечает на ваш вопрос (что кажется весьма разумным).

1) Я думаю, что вместо ${page.totalPages} вы можете использовать ${page.getTotalPages()}.

2)имеет ли смысл, если Page - содержат объект коллекции (так что вы будете использовать <#list page.items as item>), а не реализуете коллекцию, что необычно, если вы на самом деле не создаете новые данные коллекцииструктура.

1 голос
/ 08 июня 2011

Если , вы не можете или не должны изменять этот класс ... вы можете расширить DefaultObjectWrapper или BeansWrapper, чтобы он обрабатывал некоторые классы специально. Сам по себе пример DefaultObjectWrapper - это пример (он специально оборачивает объекты DOM и Jython). Вы можете деформировать объект с помощью BeanModel, но добавьте дополнительную переменную под названием "items", которая возвращает тот же объект, но помещенный в SimpleSeqence. Затем вы просто настраиваете FreeMarker для использования вашего пользовательского ObjectWrapper глобально (Configuration.setObjectWrapper), и вам не нужно никуда трогать код приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...