سؤال

لدي تطبيق يعمل بسعادة تحت Java 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;
   }

إنه يتعطل في "المحولات" (المصدر، النتيجة)؛ " خط مع استثناء:

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)

هل يعرف أحد بأي تغييرات مصنوعة على جافا بين الإصدارين الذي سيؤدي إلى ذلك؟ ماذا سيكون أسهل إصلاح؟

شكرا لمساعدتك.

هل كانت مفيدة؟

المحلول

لا أتذكر ما إذا كان الأمر ما بين 1.4 و 1.5 أو 1.5 و 1.6، لكن مكتبات Xalan التي يتم شحنها مع JVM من الشمس غيرت اسم الحزمة الخاصة بهم. ركضت إلى شيء مماثل منذ حوالي عامين. أعتقد أن ما كان علي فعله كان يشحن بشكل صريح تنفيذ XALAN الخاص بي لإصلاح المشكلة.

تحديث: قد يكون هذا ما كنت أفكر فيه، على الرغم من أنه لا يزال يمكن أن يرتبط بمشكلتك رابط النص

نصائح أخرى

من المعروف أن هذه المشكلة قد تحدث على jdk 1.6 مع xerces.jar الأقدم والتي، عندما تقدم على Classpath، توفر المستندات الخاصة بها.

لا تحدث المشكلة عند استخدام مصنع منصة الافتراضي.

قد ترغب في التحقق من INF-INF / LIB أو ما يعادلها.

هذه هي المشكلة بسبب صراع إصدار جرة (XALAN). إزالة الجرار وإعطاء محاولة

واجهت هذا نفسه java.lang.abstractmethodror. في التعليمات البرمجية الخاصة بي.

في وقت تغيير إصدار أي مكتبات لم يكن خيارا، لكنني عثرت على حل عبء عن طريق مقارنة مع رمز آخر يعمل بشكل غامض. ربما هذا قد يساعد الآخرين هناك.

كان كل ذلك يتعلق بالوثيقة التي مررت بها إلى 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();

الآن لم أعد احصل على الاستثناء.

قد ترغب في استخدام أحدث إصدار من Xerces (أعتقد أنه يجب أن يكون مرهدا مع JDK1.6)

كان لدي نفس المشكلة واستبدال الملف xercesimpl-2.0.2.jar مع xercesimpl-2.11.0.jar في مسار الفصل من طلبي. انها جيدة العمل.

هذا عملت بالنسبة لي.

 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top