Рассматривать java.lang.Iterable как выражение #list во Freemarker. - PullRequest
4 голосов
/ 31 мая 2011

У меня есть java.lang.Iterable (фактически, экземпляр com.google.gson.JsonArray).

Я бы хотел перечислить элементы в списке с помощью freemarker (2.3.16).

[#assign sports = controller.sports]
[#-- At this point, sports is bound to a com.google.gson.JsonArray instance. --]

[#list sports as sport]
  ${sport_index}
[/#list]

Я бы не хотел писать собственный bean-компонент и десериализатор Gson только для того, чтобы иметь явную коллекцию элементов.Использование Gson (который уже десериализует строку JSON в JsonObject для меня) для создания собственной группы DAG из этого JsonObject кажется мне расточительным.

К сожалению, я не смог найти способ заставить Freemarker обрабатывать java.lang.Iterable как список.Я получаю:

freemarker.template.TemplateException : Expected collection or sequence.
  controller.sports evaluated instead to freemarker.ext.beans.XMLStringModel on line 8, column 16 in sports.html.
freemarker.core.TemplateObject.invalidTypeException(line:135)
freemarker.core.IteratorBlock$Context.runLoop(line:190)
freemarker.core.Environment.visit(line:417)
freemarker.core.IteratorBlock.accept(line:102)
freemarker.core.Environment.visit(line:210)

Ответы [ 2 ]

5 голосов
/ 01 июня 2011

Явное зацикливание на итераторе должно работать, например ::10000

[#list sports.iterator() as sport]
   ${sport_index}
[/#list]
1 голос
/ 31 мая 2011

Все, что вам нужно сделать, это добавить результат iterator() на вашем JsonArray в контекст.Freemarker достаточно умен, чтобы справиться с этим, и вы можете ссылаться на него в своем шаблоне, как и на любую другую переменную, похожую на список.

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