【问题标题】:Error While JAXB Unmarshalling due to saxon9.jar由于 saxon9.jar,JAXB 解组时出错
【发布时间】:2015-06-23 10:23:07
【问题描述】:

我很喜欢使用 JAXB 进行 Unmarshalling 和 marshalling 下面是代码 sn -p

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 时,它给出了异常。不知道为什么会这样。我需要这个 jar 用于其他模块。

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)

【问题讨论】:

    标签: java xml-parsing jaxb xslt-2.0 saxon


    【解决方案1】:

    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 版本.

    【讨论】:

      【解决方案2】:

      saxon9-dom.jar 添加到您的类路径中(从同一个下载中您获得了其他 Saxon JAR 文件)。如果我没记错的话,最新的 Saxon 版本不再需要 DOM JAR 文件。

      【讨论】:

      • 但是没有 jar 代码可以正常工作,当它添加时为什么会抛出错误。为什么 JAXB 为 saxon9.jar 拾取类
      • 为什么?可能是因为决定 JAXP 接口的默认实现的复杂性:stackoverflow.com/a/1804281/919264
      • 在我的 maven 项目中列出了多个 saxon 依赖项(包括一个 saxon-dom 版本)后,我收到了这个错误。我通过仅包含 Saxon-HE 解决了该错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多