我正在使用CXF生成.NET Web服务客户端的接口。但是,有时当我使用客户端时,我收到错误:
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]
来自网上的许多其他来源,显然这是因为webservice在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的字符。
答案 0 :(得分: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版本标头,这将为我“解决”问题。如果我找到一种方法让它发挥作用,我会发布它。