2012-03-29 130 views
2

我正在使用CXF生成到.NET Web服務客戶端的接口。但是,有時,當我使用的客戶端,我得到一個錯誤:配置CXF Web服務客戶端以讀取XML 1.1響應

WARNING: Interceptor for {http://xxxxxx.com}ChangeRequestWebService#{http://xxxxxx.com/ChangeRequestWebService}GetChangeRequestById has thrown exception, unwinding now 
[com.ctc.wstx.exc.WstxLazyException] com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x1b 
at [row,col {unknown-source}]: [76,44] 

從許多其他來源網上,很明顯,這是因爲web服務編碼它在XML 1.1響應,而我的CXF客戶端讀取預期XML 1.0的響應,特殊字符0x1b在XML 1.0中是非法的。現在,我不想爭論.NET服務應該是否在其響應中使用XML 1.1,當時WSDL明顯是1.0(因爲這是規範)。我只是想能夠閱讀他們發送的內容而不會出錯。

查看CXF客戶端中的依賴關係,他們使用WoodStox 4.1.1(來自其站點)明確支持XML 1.1。 我想知道的是,有什麼方法可以配置我的CXF客戶端(通過在wsdl2java時間或運行時綁定)來在接收響應時使用XML 1.1解析器?我能找到的所有人都說他們不應該使用1.1,或者讓服務器端過濾這些字符。請注意,我無法過濾客戶端的字符,因爲我必須將數據發送回服務器,並且驗證將失敗。

作爲替代方案,我想.NET服務可能會以某種方式說明他們在響應中使用XML 1.1,但我不控制該服務,因此找出問題會更麻煩爲他們,然後建議他們修復它。另外,他們發送的數據是在數據庫中的,所以它不是Web服務的錯誤,它只有XML 1.1的字符。

回答

1

它看起來像答案是......沒有辦法預先配置CXF預期XML 1.1。

本質上講,如果XML進來沒有版本標籤:

<?xml version="1.1"> 

那麼它是不是XML 1.1。這是這裏的問題。如果xml頭存在並指定了XML 1.1,那麼CXF中的解析器會將其解析爲XML 1.1。 .NET Web服務不會(默認情況下)發送任何 XML標頭標記,因此CXF中的解析器將其正確解析爲XML 1.0。

也就是說,可能有一種方法可以在輸入流被CXF解析之前捕獲輸入流,並「插入」一個指定爲1.1的XML版本頭,這將爲我解決問題。如果我找到一種方法來實現它,我會發布它。