2010-10-26 58 views
1

我正面臨Woodstox STAX和java 1.6 STAX實現之間的奇怪運行時衝突。由於我使用的是CXF,因此它將拉伸Woodstox罐作爲其依賴項的一部分。這是我使用的示例代碼。Woodstox stax和java stax衝突

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。但不知道爲什麼它沒有失敗。

任何指針將不勝感激。

+0

你解決dis問題嗎? – 2017-05-26 19:08:18

回答

1

那麼,你必須從粗淺的看法兩種可能的選擇:

  1. 使用依賴排除關閉Woodstox。 CXF與內置的StaX一起工作 - 給內置的Stax帶來各種缺陷。

  2. 自己使用Woodstox。

但是,這裏的具體錯誤是不太可能的。我主要推薦將其發佈到cxf用戶列表中,並告訴我們您正在使用的CXF版本。

+0

感謝bmargulies ..我也在考慮直接使用woodstox對象,但無法找到將提供一些信息的文檔/示例... – Shamik 2010-10-26 01:19:51

+0

只需使用Woodstox包中的工廠即可。他們的javadoc有他們。 – bmargulies 2010-10-26 18:11:37

1

看着這個異常,它基本上說不能將StartElement投射到EndElement;它似乎不像stax實現之間的不兼容性,而是某處的錯誤。這是哪個Woodstox版本?

1

A breakXMLEvent.START_ELEMENT這個案例不應該在這裏丟失,否則它只會繼續到第一個START_ELEMENT事件的END_ELEMENT案例,因此是ClassCastException。

這部分代碼已經從問題中省略了,所以我想我會把它放在這裏,以防萬一這個簡單的錯誤可能被忽略了。這是我得到同樣的例外,導致我在這裏無論如何,當我意識到我需要休息;)