Невозможно использовать тег для перебора списка массивов в Pebble Template Engine

Я пытался перебрать список элементов массива с {% for item in items %} Синтаксис безрезультатен. Держит метание

java.lang.UnsupportedOperationException
    at java.util.AbstractMap.put(AbstractMap.java:209)
    at com.mitchellbosecke.pebble.template.Scope.put(Scope.java:53)
    at   com.mitchellbosecke.pebble.template.ScopeChain.put(ScopeChain.java:61)
at com.mitchellbosecke.pebble.template.EvaluationContext.put(EvaluationContext.java:162) exception.

Пробовал с примитивными массивами, картами, многими типами реализаций List, всегда это результат. При выполнении итеративного теста список массивов возвращает true, поэтому я думаю, что он должен быть итеративным с использованием тега for. Я делаю что-то неправильно? Пожалуйста, найдите код ниже.

PebbleTemplate template = pebbleEngine.getTemplate(
  "{% if menuItems is iterable %}{% for menuItem in menuItems %}" +
  " \"{{ menuItem }}\" this" +
  "{% endfor %}{% else %}nope{% endif %}");
StringWriter writer = new StringWriter();

List<String> menuItems = new ArrayList<>();
menuItems.add("menu item1");
menuItems.add("menu item2");
menuItems.add("menu item 3");

template.evaluate(writer, Collections.<String,Object>singletonMap("menuItems", menuItems));
System.out.println(writer);

1 ответ

Решение

Это зависит от использования одноэлементной карты. Используйте HashMap вместо этого и должно работать.

Объяснение. Scope инициализируется следующим образом:

public Scope(Map<String, Object> backingMap, boolean isLocal) {
    this.backingMap = (Map)(backingMap == null?new HashMap():backingMap);
    this.isLocal = isLocal;
}

так что он фактически использует карту, которую вы предоставляете. Когда это вызывает put над Map, он выбрасывает исключение, потому что это одиночка.

Другие вопросы по тегам