【问题标题】:Configuring CXF web service client to read XML 1.1 responses配置 CXF Web 服务客户端以读取 XML 1.1 响应
【发布时间】:2012-04-13 14:28:59
【问题描述】:

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

【问题讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2021-08-24
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多