代码之家  ›  专栏  ›  技术社区  ›  Simon Gibbs

从httpRequest读取XML时,xmlentyscanner.peekchar中出现arrayindexoutofboundsException

  •  1
  • Simon Gibbs  · 技术社区  · 18 年前

    我正在读取servlets dopost()中httpservletrequest的XML数据,并将读卡器从req.getreader()传递给JAXB解组器。我尝试了两种不同的输入XML,但我总是得到这个异常。

    SEVERE: Servlet.service() for servlet RESTPhotoAdmin threw exception
    java.lang.ArrayIndexOutOfBoundsException: 8192
            at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:491)
            at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2672)
            at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
            at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
            at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508)
            at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
            at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
            at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
            at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
            at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
            at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:195)
            at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)
            at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
            at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194)
            at com.cantorva.gigcalendar.servlets.rest.RESTPhotoAdmin.doPost(RESTPhotoAdmin.java:41)
    

    这只发生在我的Live Web服务器上,而不是本地开发计算机上。不管输入是什么(尽管我只尝试了大约90K的输入),堆栈跟踪的消息部分总是显示“8192”。我查找了xmlentityscanner.java第491行,可以看到正在读取的缓冲区,缓冲区实际上是一个数组。对于我来说,8K缓冲区不能使用从零开始的8192索引来读取是有意义的,所以这一定是一个错误——但是原因是什么,我能做什么呢?


    我问这个问题,因为我已经通过大量的侦查工作找到了答案。我想让下一个可怜的家伙免遭麻烦,因为阿帕奇已经拒绝了。

    1 回复  |  直到 17 年前
        1
  •  1
  •   Simon Gibbs    18 年前

    我发现了一个不起眼的虫子 XERCESJ-1275 它本身就是 XERCESJ-1015 . 报告没有提到我的堆栈跟踪,但提到了 ArrayIndexOutOfBoundsException . 线索是关于0的注释,它是来自读卡器的read方法的有效(或稍微有效)响应,但不是来自javadoc中的inputstream。xmlentityScanner假定永远不会发生0,因此会出现错误。

    Michael Glavassevich对文档进行了不同的解释,并将缺陷标记为无效,但解决方法只是为解组器提供一个使用 req.getInputStream() 而不是一个读者和你的手指交叉,实现中一些模糊的部分更完美地实现了不同的接口契约——它们是这样做的。