1
{% 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.
을 던지는 유지, 항상이는 결과이다. iterable 테스트를 수행 할 때 배열 목록은 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);
이상한 일입니다. for 루프 메커니즘에 의해 업데이트 될 템플릿의 평가를 위해 제공하고있는 맵을 기대하지 않았습니다. 어쨌든 매력처럼 작동합니다. 이것은 for 루프 다음에지도에있는 것입니다. {loop = {길이 = 3, 인덱스 = 2}, menuItems = [메뉴 항목 1, 메뉴 항목 2, 메뉴 항목 3], menuItem = 메뉴 항목 3} – javabot
@javabot 동의합니다! 나는이 접근 방식을 전혀 좋아하지 않는다. 그것은 충분히 방어 적이 아닙니다! 그것을 정당화하기 위해 스프링을 사용하고 거기에 모델은지도가 될 수 있습니다.이 맵은 아마도 불변으로 간주 될 수 없습니다. 사실, 단일 컨트롤러 호출을 사용하면'@ RequestMapping'으로 주석 처리 된 메소드뿐만 아니라'@ ModelAttribute'로 주석 처리 된 여러 메소드에 전달할 수 있습니다. 불변으로 제공되면 동적으로 채울 수 없습니다. – JeanValjean