2008-10-11 5 views
1

Я читаю XML-данные из HttpServletRequest в своих сервлетах doPost() и передаю Reader из req.getReader() в unmarshaller JAXB. Я пробовал несколько разных входных XML-файлов, но я всегда получаю это исключение.ArrayIndexOutOfBoundsException в XMLEntityScanner.peekChar чтение XML из HttpRequest

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». Я просмотрел XMLEntityScanner.java строку 491 и может видеть, что буфер читается, а буфер действительно является массивом. Для меня имеет смысл, что буфер 8k не может быть прочитан с использованием индекса на основе нуля 8192, поэтому это должно быть ошибка - но в чем причина и что я могу сделать?

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

ответ

1

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

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