2012-03-29 126 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版本头,这将为我解决问题。如果我找到一种方法来实现它,我会发布它。