ArrayIndexOutOfBoundsException em XML leitura XMLEntityScanner.peekChar de HttpRequest

StackOverflow https://stackoverflow.com/questions/194086

  •  10-07-2019
  •  | 
  •  

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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top