ArrayIndexOutOfBoundsException en XMLEntityScanner.peekChar leyendo XML desde HttpRequest

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy leyendo datos XML de HttpServletRequest en mis servlets doPost () y pasando el Reader de req.getReader () a un JAXB unmarshaller. He probado un par de XML de entrada diferentes, pero siempre obtengo esta excepción.

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)

Esto solo ocurre en mi servidor web Live, no en la máquina de desarrollo local. Cualquiera que sea la entrada (aunque solo probé aproximadamente 90k entradas), la parte del mensaje de la traza de la pila siempre lee "8192". Busqué la línea 491 de XMLEntityScanner.java y puedo ver que se lee un búfer, y el búfer es de hecho una matriz. Tiene sentido para mí que un búfer de 8k no se pueda leer usando un índice basado en cero de 8192, por lo que esto debe ser un error, pero ¿cuál es la causa y qué puedo hacer?


Estoy preguntando esto porque ya encontré la respuesta a través de mucho trabajo de detective. Quería salvarle la molestia al siguiente pobre chico ya que Apache ya se ha negado a arreglarlo.

¿Fue útil?

Solución

Encontré un error oscuro XERCESJ-1275 que es en sí mismo un duplicado de XERCESJ-1015 . El informe no menciona mi seguimiento de pila, pero sí menciona una ArrayIndexOutOfBoundsException . La pista fue el comentario acerca de que 0 es una respuesta válida (o algo válida) del método de lectura de un lector, pero no de un InputStream de acuerdo con JavaDoc. XMLEntityScanner supone que 0 nunca puede ocurrir, de ahí el error.

Michael Glavassevich interpreta la documentación de manera diferente y marca el defecto como no válido, pero la solución es simplemente proporcionarle al Unmarshaller un InputStream utilizando req.getInputStream () en lugar de un Reader y cruzar los dedos para que algunos Una parte oscura de la implementación es cumplir los diferentes contratos de interfaz de manera más perfecta, lo que hacen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top