14

Java 1.5 で約 1 年間問題なく動作しているアプリケーションがあります。ボックスを更新し、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)

これを引き起こす2つのバージョン間で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

この問題は、クラスパス上で独自の DocumentBuilderFactory を提供する古い xerces.jar を使用する JDK 1.6 で発生することが知られています。

プラットフォームのデフォルト ファクトリを使用すると、問題は発生しません。

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

これは私にとってはうまくいきました。

 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 に答える