업데이트처럼를 참조하십시오 :은 2.3.22부터 시작, 당신은 단지 주위에이 일을 ?api
를 사용해야합니다. 자세한 내용은 this answer 또는 this FAQ entry을 참조하십시오.
오래된 답 :
여기에 문제의 뿌리는 프리 마커 템플릿 언어 자바의 Map
유형의 해당이없는 것입니다. 대신 "hash"라는 유형이 있습니다. 이는 Map
과 유사하지만 문자열 키 (원래 변수 이름) 만 지원합니다. 따라서 fh[key]
이 표시되면 key
에 문자열 값이있는 것으로 가정합니다 (이 경우 POJO-s의 줄 바꿈으로 인해 key.toString()
의 결과가 됨) 따라서 항목을 찾지 못합니다. 따라서 솔루션은 비 문자열 키에 []
연산자를 사용하지 않고 Java API 인 Map.get(Object key)
을 사용합니다.
그리고 나머지는 오래된 ...
하지만 그렇게하려고하면 당신은 또 다른 장애물로 실행됩니다 : 기본 ObjectWrapper
는 문자열 키 때문에 Map
-s의 방법을 노출하지 않습니다 의 Map
이미 동일한 이름 공간을 채 웁니다. 너무 여러 가지 다른 이유로 기본 ObjectWrapper
싫어, 그래서 나는 항상 이런 식으로 프리 마커를 설정 :
BeansWrapper wrapper = new BeansWrapper();
wrapper.setSimpleMapWrapper(true);
cfg.setObjectWrapper(wrapper);
당신이 myMap[someStringKey]
이나 myMap(whateverKey)
등 모두 Map
-s를 사용할 수있는이 래퍼로. 따라서 귀하의 경우에는 ${fh(key)}
이됩니다. 다시 말하지만, 기본값 인 ObjectWrapper
에서는 작동하지 않습니다.
상황을 악화 시키려면 여기에 W3C DOM을 사용하는 것이 좋습니다. 위의 래퍼는 FreeMarker XML 기능을 사용할 수 있도록 자동으로 Node
-s를 포장하지 않습니다. 따라서 필요한 경우 DOM 노드를 수동으로 줄이지 않으면 DOM 노드를 인식하도록 BeansWrapper
을 확장해야합니다. 즉 운이 좋게 할 간단합니다 : 당신은 이미 프리 마커를 사용하는 환경이 사용자 정의 ObjectWrapper
이있는 경우
public class MyObjectWrapper extends freemarker.ext.beans.BeansWrapper {
public TemplateModel wrap(Object obj) throws TemplateModelException {
if (obj instanceof org.w3c.dom.Node) {
return freemarker.ext.dom.NodeModel.wrap((org.w3c.dom.Node) obj);
} else {
return super.wrap(obj);
}
}
}
마지막 것은 고려. 그런 경우에, 당신은 그걸 어떻게 든 확장하려고 더 잘 ...
이 할 일 일하지 않아. 그것은'freemarker.core.InvalidReferenceException'을주었습니다. –
대부분의 FreeMarker 설정에서는 작동하지 않습니다. 그것은 (object_wrapper 설정에 따라) 일부에서는 작동하지만, 그런 설정을 사용하는 것은 나쁜 생각입니다. 'fh? api.get (key)'는 더 깨끗한 해결책이지만이 답변에서 더 많이 볼 수 있습니다 : http://stackoverflow.com/a/28794648/606679 – ddekany