2

我正在使用 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 服务的错​​。

4

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 版本标头,这将为我“解决”问题。如果我找到让它工作的方法,我会发布它。

于 2012-03-31T02:40:03.917 回答