【问题标题】:ArrayIndexOutOfBoundsException in XMLEntityScanner.peekChar reading XML from HttpRequestXMLEntityScanner.peekChar 中的 ArrayIndexOutOfBoundsException 从 HttpRequest 读取 XML
【发布时间】:2008-10-11 13:50:33
【问题描述】:

我正在从我的 servlet doPost() 中的 HttpServletRequest 读取 XML 数据,并将 Reader 从 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 行,可以看到正在读取的缓冲区,并且该缓冲区确实是一个数组。对我来说,使用从零开始的索引 8192 无法读取 8k 缓冲区是有道理的,所以这一定是一个错误 - 但原因是什么,我该怎么办?


我问这个问题已经通过大量的侦探工作找到了答案。我想为下一个可怜的家伙省去麻烦,因为 Apache 已经拒绝修复它。

【问题讨论】:

    标签: java servlets jaxb xerces


    【解决方案1】:

    我发现了一个不知名的错误 XERCESJ-1275,它本身就是 XERCESJ-1015 的副本。该报告没有提到我的堆栈跟踪,但确实提到了ArrayIndexOutOfBoundsException。线索是关于 0 是来自 Reader 的 read 方法的有效(或有些有效)响应的评论,而不是来自 JavaDoc 的 InputStream 的评论。 XMLEntityScanner 假定 0 永远不会发生 - 因此错误。

    Michael Glavassevich 以不同的方式解释文档并将缺陷标记为无效,但解决方法是简单地使用 req.getInputStream() 而不是 Reader 为 Unmarshaller 提供 InputStream 并祈祷实现的某些晦涩部分正在实现不同更完美的接口契约 - 他们确实这样做了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 2011-03-04
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2011-07-08
      相关资源
      最近更新 更多