使用jdom getParent时出现Freemarker 2.3.19错误

时间:2013-10-14 08:29:46

标签: java freemarker jdom nodelist

我在模板中使用此功能来显示树并使用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);

在我升级到freemarker 2.3.19之前一切正常。 现在它抛出了这个错误:

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)

如果我删除以下代码行:

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

我不再有这个错误,但树没有很好地显示。

经过一番研究,我发现他们是一个补丁,通过用getParentElement替换getParent来修复NodeListModel.java。当我通过添加固定的NodeListModel.java来覆盖这个类时,一切正常。

但是我想知道如果没有添加这个补丁它们是否是另一个解决方案,也许我需要更改xml格式或用其他东西替换Node._parent。

提前感谢您的帮助。

卡琳

2 个答案:

答案 0 :(得分:1)

早在2004年,当JDOM处于'测试版'时,getParent()签名发生了变化,getParentElement() was added. Freemarker is compiled与JDOM beta 0.8(来自2002 - 11 years ago)。

我建议您联系Freemarker tean,并建议更新以支持JDOM 1.1.3以及2.0.5

答案 1 :(得分:0)

尝试使用JDOM 0.8 beta ...或者,您可以将freemareker.ext.jdom复制到另一个包中,在那里修补它,然后使用它来包装JDOM对象。 (或者,如果有足够的需求,可以在FreeMarker中进行改进,以便它支持多个JDOM版本。)

BTW,ar1["${Node._parent.@NodeID._text}"]可以写成ar1[Node._parent.@NodeID._text],但错误不会因此而消失。