1

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

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


私は、多くの探偵の仕事を通じて、すでに答えを見つけたので、これを尋ねています。Apache はすでに修正を拒否しているので、次のかわいそうな人を手間から救いたかったのです。

4

1 に答える 1

1

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

Michael Glavassevich はドキュメントを別の方法で解釈し、欠陥を無効とマークしますが、回避策は単に Unmarshaller にreq.getInputStream()Reader ではなく InputStream を使用して提供し、実装のあいまいな部分がさまざまなインターフェイス コントラクトをより完全に満たしていることを指摘することです。彼らはそうします。

于 2008-10-11T14:07:02.703 に答える