我正在使用 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]
从网上的许多其他来源来看,很明显这是因为 Web 服务将其响应编码为 XML 1.1,而我的 CXF 客户端正在读取该响应,需要 XML 1.0,并且特殊字符 0x1b 在 XML 1.0 中是非法的。现在,当 WSDL 显然是 1.0(因为那是规范)时,我不想争论 .NET 服务是否应该在其响应中使用 XML 1.1。我只想能够阅读他们发送的内容而不会出错。
查看 CXF 客户端中的依赖项,他们使用 WoodStox 4.1.1,它(来自他们的站点)清楚地支持 XML 1.1。 我想知道的是,有没有办法配置我的 CXF 客户端(通过在 wsdl2java 时间或运行时绑定)在接收响应时使用 XML 1.1 解析器? 我能找到的只是人们说他们不应该使用 1.1,或者让服务器端过滤这些字符。请注意,我无法在客户端过滤字符,因为我必须将数据发送回服务器,并且验证会失败。
作为替代方案,我认为 .NET 服务可以以某种方式指定他们在响应中使用 XML 1.1,但我不控制该服务,因此为他们找出问题然后再找出问题会更麻烦建议他们修复它。另外,他们发送的数据在一个数据库中,所以它有 XML 1.1-only 字符不是 Web 服务的错。