ArrayIndexOutOfBoundsException em XML leitura XMLEntityScanner.peekChar de HttpRequest
Pergunta
Estou lendo dados XML a partir do HttpServletRequest no meu servlets doPost () e passando o leitor do req.getReader () para um unmarshaller JAXB. Eu tentei um par de diferentes XMLs de entrada, mas eu sempre recebo esta exceção.
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)
Isso só acontece no meu servidor web ao vivo não na máquina de desenvolvimento local. Seja qual for a entrada é (embora eu só tentei cerca de 90k entradas) a parte da mensagem do rastreamento de pilha sempre lê "8192". I Observava-se linha XMLEntityScanner.java 491 e pode ver um tampão a ser lido, e o tampão é de facto uma matriz. Faz sentido para mim que um buffer de 8k não pode ser lido usando um índice com base zero da 8192 de modo que este deve ser um bug - mas qual é a causa e o que posso fazer
Eu estou fazendo esta já ter encontrado a resposta através de lotes de trabalho de detetive. Eu queria salvar o próximo cara pobre do incômodo desde Apache já recusou-se a corrigi-lo.
Solução
Eu encontrei um bug obscuro XERCESJ-1275 que se uma duplicata é de XERCESJ-1015 . O relatório não mencionar o meu rastreamento de pilha, mas não menciona a ArrayIndexOutOfBoundsException
. A pista foi o comentário sobre sendo 0 uma resposta válida (ou um pouco válido) de método de leitura de um leitor, mas não de um InputStream de acordo com o JavaDoc. XMLEntityScanner assume que 0 nunca pode ocorrer -. Assim, o erro
Michael Glavassevich interpreta a documentação de forma diferente e marca o inválidos defeito, mas o trabalho em torno é simplesmente fornecer o unmarshaller um InputStream usando req.getInputStream()
em vez de um leitor e cruzar os dedos que alguma parte obscura da implementação está cumprindo os diferentes contratos de interface mais perfeitamente -. que eles fazem