Java-метод работает в 1,5, но не 1,6
У меня есть приложение, которое работает под управлением Java 1.5 в течение года. Мы только что обновили ящики и установили Java 1.6.
После развертывания приложения на новом сервере мы обнаружили, что приложение бросает исключение, когда пытается преобразовать некоторый XML. Мы не могли понять, почему это происходит, пока мы не развернули его локально, и это случилось. После изменения SDK до версии 1.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 между двумя версиями, которые могут вызвать это? Что было бы самым простым решением?
Спасибо за вашу помощь.
Ответы
Ответ 1
Я не помню, было ли это между 1.4 и 1.5 или 1.5 и 1.6, но библиотеки Xalan, которые поставлялись с JVM из Sun, изменили имя своего пакета. Я столкнулся с чем-то подобным около 2 лет назад. Я думаю, что мне нужно было явно отправить мою собственную реализацию xalan, чтобы исправить эту проблему.
UPDATE: Возможно, это было то, о чем я думал, хотя он все еще может быть связан с вашей проблемой текст ссылки
Ответ 2
Известно, что эта проблема возникает на JDK 1.6 с более старым xerces.jar, который, когда на пути к классам, предоставляет свой собственный DocumentBuilderFactory.
Проблема не возникает при использовании платформы по умолчанию factory.
Вы можете проверить свой WEB-INF/lib или эквивалент.
Ответ 3
Это проблема из-за конфликта версии jar (Xalan). Удалите банки и попробуйте
Ответ 4
В моем коде встречается тот же самый 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;
}
Чтобы решить эту проблему, я меняю строку factory следующим образом:
DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl();
Теперь я больше не получаю исключения.
Ответ 5
Вы можете использовать последнюю версию из Xerces (я считаю, что она должна быть скомпилирована с JDK1.6)
Ответ 6
У меня была такая же проблема, и я заменил файл xercesImpl-2.0.2.jar на xercesImpl-2.11.0.jar в пути класса моего приложения. Его работа прекрасна.
Ответ 7
Это сработало для меня.
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);