Java XMLEntityScanner.peekChar中的ArrayIndexOutOfBoundsException从HttpRequest读取XML

Java XMLEntityScanner.peekChar中的ArrayIndexOutOfBoundsException从HttpRequest读取XML,java,servlets,jaxb,xerces,Java,Servlets,Jaxb,Xerces,我从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.

我从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读取是有道理的,所以这一定是一个错误-但是原因是什么,我能做什么


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

我发现了一个模糊的bug,它本身就是一个复制品。报告没有提到我的堆栈跟踪,但提到了一个
ArrayIndexOutOfBoundsException
。根据JavaDoc,线索是关于0是来自读取器读取方法的有效(或某种程度上有效)响应的注释,但不是来自InputStream。XMLEntityScanner假定0永远不会发生-因此出现错误

Michael Glavassevich以不同的方式解释文档并将缺陷标记为无效,但解决方法只是使用
req.getInputStream()向解组器提供一个InputStream
而不是读者,祝你好运,实现中一些模糊的部分正在更完美地履行不同的接口契约——它们确实如此。

我发现了一个模糊的bug,它本身就是。报告没有提到我的堆栈跟踪,但提到了一个
ArrayIndexOutOfBoundsException
。根据JavaDoc,线索是关于0是来自读取器读取方法的有效(或某种程度上有效)响应的注释,但不是来自InputStream。XMLEntityScanner假定0永远不会发生-因此出现错误

Michael Glavassevich以不同的方式解释文档并将缺陷标记为无效,但解决方法只是使用
req.getInputStream()向解组器提供一个InputStream
而不是读者,祈祷实现中一些模糊的部分能够更完美地实现不同的接口契约——他们确实做到了