不能用于标记迭代Pebble模板引擎中的Array List

时间:2016-06-06 05:43:16

标签: java template-engine pebble

我一直试图用{% 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 个答案:

答案 0 :(得分:1)

这取决于单例地图的使用。 请改用HashMap,并且应该可以使用。

解释。 Scope初始化如下:

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

所以它实际上重用了你提供的地图。当它在put上调用Map时,它会抛出异常,因为它是一个单例。