2016-06-06 3 views
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); 

답변

1

싱글 톤 맵의 사용 여부에 따라 다릅니다. 대신 HashMap을 사용하십시오.

설명. 다음과 같이 Scope는 초기화된다

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

은 그래서 실제로 당신이 제공하는지도를 다시 사용합니다. Map을 통해 put을 호출하면 단일 톤이기 때문에 예외가 발생합니다.

+0

이상한 일입니다. for 루프 메커니즘에 의해 업데이트 될 템플릿의 평가를 위해 제공하고있는 맵을 기대하지 않았습니다. 어쨌든 매력처럼 작동합니다. 이것은 for 루프 다음에지도에있는 것입니다. {loop = {길이 = 3, 인덱스 = 2}, menuItems = [메뉴 항목 1, 메뉴 항목 2, 메뉴 항목 3], menuItem = 메뉴 항목 3} – javabot

+1

@javabot 동의합니다! 나는이 접근 방식을 전혀 좋아하지 않는다. 그것은 충분히 방어 적이 아닙니다! 그것을 정당화하기 위해 스프링을 사용하고 거기에 모델은지도가 될 수 있습니다.이 맵은 아마도 불변으로 간주 될 수 없습니다. 사실, 단일 컨트롤러 호출을 사용하면'@ RequestMapping'으로 주석 처리 된 메소드뿐만 아니라'@ ModelAttribute'로 주석 처리 된 여러 메소드에 전달할 수 있습니다. 불변으로 제공되면 동적으로 채울 수 없습니다. – JeanValjean