14

我有一个应用程序已经在 J​​ava 1.5 下愉快地运行了大约一年。我们刚刚更新了这些盒子并安装了 Java 1.6。

将应用程序部署到新服务器后,我们发现应用程序在尝试转换某些 XML 时抛出异常。我们无法理解为什么会发生这种情况,直到我们在本地部署它并且发生了同样的事情。将 SDK 更改为 v1.5 后,问题停止并且应用程序运行正常。

这是方法的来源:

import java.io.StringWriter;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Element;
import org.w3c.dom.Node;


   public static String xmlToString(Node node) {
    try {
        Source source = new DOMSource(node);
        StringWriter stringWriter = new StringWriter();
        Result result = new StreamResult(stringWriter);
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer();
        transformer.transform(source, result);
        return stringWriter.getBuffer().toString();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }
    return null;
   }

它在“transformer.transform(source, result);”上崩溃了 行例外:

Exception in thread "main" java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:373)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:127)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)

有谁知道这两个版本之间对 Java 所做的任何更改会导致这种情况?什么是最简单的解决方法?

谢谢你的帮助。

4

7 回答 7

18

我不记得它是在 1.4 和 1.5 还是 1.5 和 1.6 之间,但是 Sun 的 JVM 附带的 Xalan 库更改了它们的包名称。大约 2 年前,我遇到了类似的事情。我认为我必须做的是明确发布我自己的 xalan 实现来解决问题。

更新:这可能是我的想法,尽管它仍然可能与您的问题链接文本有关

于 2009-08-10T15:08:19.010 回答
7

已知此问题发生在具有较旧 xerces.jar 的 JDK 1.6 上,当在类路径上时,它提供了自己的 DocumentBuilderFactory。

使用平台默认工厂时不会出现该问题。

您可能需要检查您的 WEB-INF/lib 或等效项。

于 2011-11-30T02:29:28.517 回答
4

这是由于 jar(Xalan) 版本冲突引起的问题。取出罐子试一试

于 2009-08-10T16:27:14.110 回答
2

我在我的代码中遇到了同样的java.lang.AbstractMethodError 。

当时更改任何库的版本不是一种选择,但我通过与其他神秘工作的代码进行比较找到了一种解决方法。也许这可能会帮助其他人。

这一切都与我传递给 DOMSource() 的文档有关。 最初我以标准方式创建了一个文档:

    private static Document documentFromInputStream(InputStream in) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new InputSource(in));
    return doc;
}

为了解决这个问题,我将工厂生产线更改如下:

        DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl();

现在我不再得到例外。

于 2013-10-30T20:21:22.013 回答
0

您可能想使用 Xerces 的最新版本(我相信它应该与 JDK1.6 兼容)

于 2011-04-11T13:50:19.987 回答
0

我遇到了同样的问题并在我的应用程序的类路径中用 xercesImpl-2.11.0.jar 替换了 xercesImpl-2.0.2.jar 文件。它工作正常。

于 2015-05-19T17:11:47.663 回答
0

这对我有用。

 TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(sWout);
            transformer.transform(source, result);
于 2016-08-10T12:43:42.120 回答