문제

I have this function in my template to show a tree and using freemarker 2.0 :

function doBeforeToggle() {}
      var ar1=new Array();
      var CurrentTree = null;
      var label = null;
      <assign First = "true">
      <foreach Node in PUBLISH._children._descendantOrSelf>
        <if First = "true" >
          var tree=new WebFXTree("${Node.@Label._text}");
          ar1["${Node.@NodeID._text}"] = tree;
          <assign First = "false">
        <else>
          var NewTree = new WebFXTreeItem("${Node.@Label._text}");
          <if Node.@File>
            NewTree.action = "${Node.@File._text}"
          <else>
            NewTree.icon = webFXTreeConfig.folderIcon;
          </if>
          ar1["${Node.@NodeID._text}"] = NewTree;
         CurrentTree=ar1["${Node._parent.@NodeID._text}"];
          CurrentTree.add(NewTree);
        </if>
      </foreach>
      document.write(tree);

It was working fine until i upgrade to freemarker 2.3.19. Now it is throwing this error :

java.lang.NoSuchMethodError: org.jdom.Element.getParent()Lorg/jdom/Element;
at freemarker.ext.jdom.NodeListModel.getParent(NodeListModel.java:847)
at freemarker.ext.jdom.NodeListModel.access$1100(NodeListModel.java:122)
at freemarker.ext.jdom.NodeListModel$ParentOp.operate(NodeListModel.java:868)
at freemarker.ext.jdom.NodeListModel.evaluateElementOperation(NodeListModel.java:1035)
at freemarker.ext.jdom.NodeListModel.get(NodeListModel.java:473)
at freemarker.core.Dot._getAsTemplateModel(Dot.java:76)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.Dot._getAsTemplateModel(Dot.java:74)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.Dot._getAsTemplateModel(Dot.java:74)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.Expression.getStringValue(Expression.java:93)
at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.IfBlock.accept(IfBlock.java:82)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)
at freemarker.core.Environment.visit(Environment.java:428)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.Environment.process(Environment.java:199)
at freemarker.template.Template.process(Template.java:259)

If i remove the following line of code:

CurrentTree=ar1["${Node._parent.@NodeID._text}"];

I dont have this error anymore but the tree is not well displayed.

After some research, i found their is a patch which fix NodeListModel.java by replacing getParent by getParentElement. When i override this class by adding the fixed NodeListModel.java, everything works fine.

But i was wondering if their is another solution without adding this patch, maybe i need to change the xml format or replace Node._parent by something else.

Thank you in advance for any help.

Carine

도움이 되었습니까?

해결책

Back in 2004, when JDOM was in 'beta', the getParent() signature was changed and the getParentElement() was added. Freemarker is compiled with JDOM beta 0.8 (from 2002 - 11 years ago).

I would recommend that you contact the Freemarker tean and suggest an update to support both JDOM 1.1.3 as well as 2.0.5

다른 팁

Try using JDOM 0.8 beta... or, you can copy freemareker.ext.jdom into another package, patch it there, and then use that for wrapping the JDOM object. (Or, if there's enough demand for it, it could be improved in FreeMarker, so that it supports multiple JDOM versions.)

BTW, ar1["${Node._parent.@NodeID._text}"] can just be written as ar1[Node._parent.@NodeID._text], although the error will not go away because of that.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top