Java метод работает в 1.5, но не 1.6 - PullRequest
14 голосов
/ 10 августа 2009

У меня есть приложение, которое успешно работает под 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;
   }

Это происходит сбой на "transformer.transform (источник, результат);" строка с исключением:

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 между двумя версиями, которые могут вызвать это? Что было бы проще всего исправить?

Спасибо за вашу помощь.

Ответы [ 7 ]

18 голосов
/ 10 августа 2009

Я не помню, было ли это между 1,4 и 1,5 или 1,5 и 1,6, но библиотеки Xalan, поставляемые с JVM от Sun, изменили имя своего пакета. Я столкнулся с чем-то похожим около 2 лет назад. Я думаю, что я должен был явно отправить свою собственную реализацию xalan для решения проблемы.

ОБНОВЛЕНИЕ: Возможно, это то, о чем я думал, хотя это все еще может быть связано с вашей проблемой текст ссылки

7 голосов
/ 30 ноября 2011

Известно, что эта проблема возникает в JDK 1.6 с более старым xerces.jar, который, находясь в classpath, предоставляет собственный DocumentBuilderFactory.

Проблема не возникает при использовании фабрики по умолчанию для платформы.

Возможно, вы захотите проверить свой WEB-INF / lib или эквивалентный.

3 голосов
/ 10 августа 2009

Это проблема из-за конфликта версий jar (Xalan). Удалите банки и попробуйте

2 голосов
/ 31 октября 2013

Я сталкиваюсь с тем же 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();

Теперь я больше не получаю исключение.

0 голосов
/ 10 августа 2016

Это сработало для меня.

 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);
0 голосов
/ 19 мая 2015

У меня была та же проблема, и я заменил файл xercesImpl-2.0.2.jar на xercesImpl-2.11.0.jar в пути к классам моего приложения. Работает нормально.

0 голосов
/ 11 апреля 2011

Возможно, вы захотите использовать последнюю версию от Xerces (я считаю, что она должна быть совместима с JDK1.6)

...