2

Woodstox STAX と Java 1.6 STAX の実装の間で奇妙な実行時競合が発生しています。私は CXF を使用しているため、依存関係の一部として Woodstox jar をプルしています。これが私が使用しているサンプルコードです。

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

XMLInputFactory factory = (XMLInputFactory)XMLInputFactory.newInstance();
XMLEventReader reader =
factory.createXMLEventReader(new StringReader(xml)); 
while (reader.hasNext()){
XMLEvent event = reader.nextEvent();
switch (event.getEventType()){
case XMLEvent.START_ELEMENT :
StartElement se = event.asStartElement();
...........
...........
case XMLEvent.END_ELEMENT :
EndElement endElement = event.asEndElement();
if (event.asEndElement().getName().getLocalPart()==("document"))
// do something

実行時に、次の例外が発生します。

java.lang.Exception: java.lang.ClassCastException: com.ctc.wstx.evt.CompactStartElement cannot be cast to javax.xml.stream.events.EndElement

ラインに到達したときEndElement endElement = event.asEndElement();

失敗しないのに、なぜこの時点で原因になっているのか、私はちょっと困惑しています StartElement se = event.asStartElement();

デバッグ中に、イベント オブジェクトが com.ctc.wstx.evt パッケージの一部であり、javax.xml.stream ではないことがわかりました。しかし、以前に失敗しなかった理由がわかりません。

どんなポインタでも高く評価されます。

4

3 に答える 3

2

表面的な観点からは、次の 2 つの選択肢があります。

  1. Woodstox をオフにするには、依存関係の除外を使用します。CXF はビルトイン StaX と連携します -- ビルトイン Stax のさまざまなバグを受け入れるか受け入れます。

  2. Woodstox をご自身で使用してください。

ただし、ここでの特定のエラーは少しありそうにありません。これを cxf users リストに投稿し、使用している CXF のバージョンを正確に記載することをお勧めします。

于 2010-10-26T01:13:03.797 に答える
1

breakケースの最後にあるAをXMLEvent.START_ELEMENTここで欠落させるべきではありません。そうしないEND_ELEMENTと、最初の START_ELEMENT イベントでケースが続行されるため、ClassCastException が発生します。

コードのその部分は質問から省略されているため、この単純なエラーが見落とされた可能性がある場合に備えて、ここに配置すると思いました. 休憩が必要だと気づいたとき、とにかくここに私を導いたのと同じ例外を取得した方法です;)

于 2015-06-23T18:11:24.707 に答える
1

例外を見ると、基本的に StartElement を EndElement にキャストできないことが示されています。これは、stax 実装間の非互換性ではなく、どこかのバグのようです。これはどのウッドストックのバージョンですか?

于 2011-01-13T19:14:29.990 に答える