Метод Java работает в 1.5, но не в 1.6

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

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


person James Camfield    schedule 10.08.2009    source источник
comment
Кажется, у вас есть конфликтующая реализация Xerxes где-то в вашем пути к классу.   -  person akarnokd    schedule 10.08.2009
comment
Какие банки, связанные с xml, находятся в вашем пути к классам?   -  person Yishai    schedule 10.08.2009


Ответы (7)


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

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

person Chris Boran    schedule 10.08.2009
comment
Вы должны использовать только JAXP API или полагаться на сами библиотеки xerces, а не на реализацию, поставляемую солнцем (которая будет различаться между выпусками). - person wds; 10.08.2009
comment
Я вижу случай, когда это происходит, и код вызывает TransformerFactory для создания Transformer, затем transform() на Transformer и генерирует это исключение. Кажется, это правильный способ сделать это. Код отлично работал в Java 5, а после обновления до Java 6 выдает это исключение. Включение моей собственной копии xalan устранило проблему. - person Sarel Botha; 09.05.2011
comment
где я могу найти свою собственную копию xalan? и как мне включить и заменить то, что дает оракул??? - person Dheeraj Kumar; 10.08.2016

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

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

Вы можете проверить свой WEB-INF/lib или аналогичный.

person billyblind    schedule 30.11.2011

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

person Niger    schedule 10.08.2009
comment
Я попытался добавить новый Xerces JAR, но это не помогло в соответствии с ответом, получившим наибольшее количество голосов, поэтому я попробовал ваше предложение и удалил Xerces JAR из моего пути сборки, и это сработало, спасибо! - person Kairan; 22.07.2015
comment
XALAN входит в rt.jar Вы говорите, что я должен удалить jar из пути jre/lib? - person Dheeraj Kumar; 10.08.2016

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

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

person Robert Patterson    schedule 30.10.2013
comment
Здорово! не нужно иметь дело с конфликтом jar. Спасибо. - person Hezi Schrager; 11.12.2014

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

person Muhammad Hewedy    schedule 11.04.2011

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

person spolishe    schedule 19.05.2015

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

 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);
person Dheeraj Kumar    schedule 10.08.2016