【问题标题】:Freemarker 2.3.19 error when using jdom getParent使用 jdom getParent 时出现 Freemarker 2.3.19 错误
【发布时间】:2013-10-14 08:29:46
【问题描述】:

我的模板中有这个功能来显示一棵树并使用 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}"];

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

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

但我想知道他们是否是不添加此补丁的另一种解决方案,也许我需要更改 xml 格式或用其他东西替换 Node._parent。

提前感谢您的帮助。

卡琳

【问题讨论】:

    标签: java freemarker jdom nodelist


    【解决方案1】:

    早在 2004 年,当 JDOM 处于“测试版”时,getParent() 签名已更改,getParentElement() was added. Freemarker is compiled 使用 JDOM 测试版 0.8(来自 2002 - 11 years ago)。

    我建议您联系 Freemarker 团队并建议更新以支持 JDOM 1.1.3 和 2.0.5

    【讨论】:

    • FreeMarker 也通过其他一些可选的依赖项来实现这一点,比如它支持多个 Python 版本。 OTOH 我想知道有多少人仍在使用 JDOM 支持。它本来应该被删除很长时间,但它不能按照版本策略 pror FM 2.4.0。此外,OP 从 2002 年起从 FreeMarker 2.0 升级...这不是开玩笑,因为在 2004 年中期之前,FreeMarker 并没有因为在向后兼容性方面受到纪律处分而出名...
    • 从我 JDOM 维护者的角度来回答。我担心有像 FreeMaker 这样积极维护的项目使用 beta 版 API。 JDOM API 在多年前的 1.0 版本中得到稳定,并保持对所有版本的完全向后兼容性,直到 2.0 引入了泛型。如果他们愿意,我可以帮助 FreeMaker 人充分利用 JDOM 1.x 和 2.x。
    • 虽然 FreeMarker 正在积极开发中,但 freemarker.ext 包的情况有点复杂......它们是扩展(如附加组件),它们中的大多数应该在单独的可选中jar。并不是所有这些都得到积极维护......就像 JDOM 或 Rhino 包几乎被废弃了。
    • @ddekany - 我看到你维护 FreeMarker 套件。我没有使用它(并且因为 JDOM 标签而选择了这个 SO Question)。在我看来,OP 的“正确”解决方案是使用更新的 NodeListModel。将现有的 JDOM 0.8 模型更新到 JDOM 1.x 并使用(大部分相似的)JDOM 2.0.x API(但在 org.jdom2.* 命名空间中包含包)添加另一个 JDOM2 模型相对简单。如果您对提交感兴趣,我可以推动工作....
    【解决方案2】:

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

    顺便说一句,ar1["${Node._parent.@NodeID._text}"] 可以写成ar1[Node._parent.@NodeID._text],尽管错误不会因此而消失。

    【讨论】:

    • 我建议不要使用 JDOM 0.8(它有许多问题在自 2002 年以来发布的多个 JDOM 版本中得到了解决......)。 FreeMarker 目前正在积极开发中。如果 Freemarker 维护者有兴趣,我可以帮助他们迁移他们的系统以支持 JDOM 1.x 和 2.x ......这相对来说是微不足道的。
    • 好吧,我想这并不难......只是freemarker.ext.jdom本身已被弃用。这就是为什么我说最好知道有多少人仍在使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2016-11-17
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多