我使用 JAXB 进行解码和编码,下面是代码片段
public static Application getApplicationFromString(String str) throws JAXBException, ParserConfigurationException, SAXException, IOException {
JAXBContext jb = getJAXBContext();
Unmarshaller um = jb.createUnmarshaller();
Application app = (Application) um.unmarshal(IOUtils.toInputStream(str));
return app;
}
private static JAXBContext getJAXBContext() throws JAXBException {
return JAXBContext.newInstance(Application.class);
}
它工作正常,但是当我添加 jar saxon9.jar 时,它给出了异常。不知道为什么会发生这种情况。我需要这个 jars 用于其他模块。
Exception in thread "main" java.lang.UnsupportedOperationException: Saxon cannot write a DOMResult unless saxon9-dom.jar is on the classpath
at net.sf.saxon.event.SerializerFactory.getReceiver(SerializerFactory.java:189)
at net.sf.saxon.IdentityTransformerHandler.startDocument(IdentityTransformerHandler.java:99)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.DomLoader$State.<init>(DomLoader.java:68)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.DomLoader.startElement(DomLoader.java:103)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:45)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:559)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:379)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:204)
at TestJaxB.getApplicationFromString(TestJaxB.java:46)
at TestJaxB.main(TestJaxB.java:25)
最佳答案
JAXP 工厂机制的一个不幸后果是,当您将 XSLT 处理器放在类路径上时,从未设计或测试过与该 XSLT 处理器一起运行的软件突然发现自己正在使用它,这可能会产生各种不可预测的后果。因此,Saxon 的最新版本不再将自己宣传为 JAXP XPath 工厂,因为 JAXP XPath API 的定义非常薄弱,使用与您测试的引擎不同的引擎很可能会导致您的应用程序失败。然而,XSLT API 并不是什么问题,如果 Saxon 可用,大多数应用程序都会非常乐意使用它 - 通常它们甚至会获得意想不到的性能提升。这里的特殊失败是因为您的类路径上有一个 Saxon JAR,而不是另一个。有一段时间(几年前),Saxon 将 DOM 支持代码分离到一个单独的 JAR 文件中,因为 JDK 1.4 和 JDK 1.5 之间的 DOM API 发生了不兼容的更改,这使得生成可同时使用这两种版本的 Saxon 版本变得非常困难.
关于java - 由于 saxon9.jar,JAXB 解码时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000196/