ArrayIndexOutOfBoundsException в XMLEntityScanner.peekChar, читающий XML из HttpRequest - PullRequest
1 голос
/ 11 октября 2008

Я читаю данные XML из HttpServletRequest в моих сервлетах doPost () и передаю Reader из req.getReader () в unmarshaller 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, а не на локальной машине разработки. Каким бы ни был ввод (хотя я пробовал только около 90 тыс. Входов), часть сообщения трассировки стека всегда читается как «8192». Я посмотрел строку 491 XMLEntityScanner.java и вижу, что буфер читается, а буфер действительно является массивом. Для меня имеет смысл, что 8k буфер не может быть прочитан с использованием индекса с нуля, равного 8192, так что это должно быть ошибкой - но в чем причина и что я могу сделать?


Я спрашиваю об этом, уже найдя ответ через множество детективных работ. Я хотел избавить следующего беднягу от хлопот, поскольку Apache уже отказался его починить.

1 Ответ

1 голос
/ 11 октября 2008

Я обнаружил неясную ошибку XERCESJ-1275 , которая сама по себе является копией XERCESJ-1015 . В отчете не упоминается моя трассировка стека, но упоминается ArrayIndexOutOfBoundsException. Подсказкой был комментарий о том, что 0 является действительным (или несколько верным) ответом от метода чтения Reader, но не от InputStream в соответствии с JavaDoc. XMLEntityScanner предполагает, что 0 никогда не может возникнуть - таким образом, ошибка.

Михаил Главасевич по-разному интерпретирует документацию и помечает дефект как недействительный, но обходной путь заключается в том, чтобы просто предоставить Unmarshaller InputStream, используя req.getInputStream() вместо Reader, и скрестить пальцы, что некоторая непонятная часть реализации выполняет разные интерфейс сжимается более идеально - что они и делают.

...