我有一个应用程序,它在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(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)
有没有人知道两个版本之间对Java造成的任何更改会导致这种情况?什么是最容易解决的问题?
感谢您的帮助。
答案 0 :(得分:18)
我不记得它是介于1.4和1.5还是1.5和1.6之间,但是Sun附带的JVM附带的Xalan库改变了它们的包名。大约两年前我碰到了类似的东西。我认为我必须做的是明确地发布我自己的xalan实现来解决问题。
更新:这可能是我想到的,虽然它仍然可能与您的问题有关link text
答案 1 :(得分:7)
已知这个问题发生在JDK 1.6上,其中包含较旧的xerces.jar,当它在classpath上时,它提供了自己的DocumentBuilderFactory。
使用平台默认工厂时不会出现此问题。
您可能需要检查WEB-INF / lib或同等文件。
答案 2 :(得分:3)
这是因为jar(Xalan)版本冲突的问题。取出罐子试一试
答案 3 :(得分:2)
我在代码中遇到了同样的 java.lang.AbstractMethodError 。
当时更改任何库的版本不是一个选项,但我通过与神秘工作的其他代码进行比较找到了一种解决方法。也许这可能会帮助其他人。
这一切都与我传入DOMSource()的Document有关。 最初我以标准方式创建了一个文档:
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();
现在我不再得到例外。
答案 4 :(得分:0)
您可能希望使用Xerxes的最新版本(我相信它应该与JDK1.6兼容)
答案 5 :(得分:0)
我遇到了同样的问题&在我的应用程序的类路径中用xercesImpl-2.11.0.jar替换了xercesImpl-2.0.2.jar文件。它的工作正常。
答案 6 :(得分: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);