HttpRequestからXMLを読み取るXMLEntityScanner.peekCharのArrayIndexOutOfBoundsException

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

  •  10-07-2019
  •  | 
  •  

質問

サーブレットdoPost()のHttpServletRequestからXMLデータを読み取り、req.getReader()からJAXBアンマーシャラーにReaderを渡します。いくつかの異なる入力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)

これは、ローカルの開発マシンではなく、ライブWebサーバーでのみ発生します。入力が何であっても(私は約90kの入力しか試しませんでしたが)、スタックトレースのメッセージ部分は常に「8192」と表示されます。 XMLEntityScanner.javaの491行目を調べると、読み取られているバッファーを確認できますが、バッファーは実際には配列です。 8192のゼロベースのインデックスを使用して8kバッファーを読み取ることができないため、これはバグに違いありませんが、原因は何ですか?


多くの探偵の仕事を通してすでに答えを見つけているので、これを尋ねています。 Apacheはすでに修正を拒否しているので、次の貧しい人の手間を省きたいと思いました。

役に立ちましたか?

解決

それ自体が重複している不明瞭なバグ XERCESJ-1275 を見つけました XERCESJ-1015 の。レポートにはスタックトレースは記載されていませんが、 ArrayIndexOutOfBoundsException は記載されています。手掛かりは、JavaDocによるとInputStreamからではなく、Readerの読み取りメソッドからの有効な(またはある程度有効な)応答である0に関するコメントでした。 XMLEntityScannerは、0は決して発生しないと想定しています。したがって、エラーです。

Michael Glavassevichはドキュメントを異なる方法で解釈し、欠陥を無効としてマークしますが、回避策は単にリーダーではなく req.getInputStream()を使用してUnmarshallerにInputStreamを提供し、実装の不明瞭な部分は、異なるインターフェイスコントラクトをより完全に満たすことです-それはそうです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top