【问题标题】:Accessing SOAP web service with incorrect wsdl使用不正确的 wsdl 访问 SOAP Web 服务
【发布时间】:2011-05-20 11:30:40
【问题描述】:

背景:

我需要使用存在几个问题的现有 Web 服务(SOAP over http):

1) 服务器上的 wsdl 甚至不像他们的文档中描述的 web 服务,其中包含一个完全不同的 wsdl 文件

2) 他们的文档提供的 wsdl 文件似乎接近于描述服务器上的 Web 服务,但是当我使用 cxf 生成 java 客户端代码并使用它来访问 Web 服务时,cxf 会抛出如下异常

 javax.xml.bind.UnmarshalException: unexpected element (uri:"http://us-labs.companyxyz.com/", local:"searchResponse"). Expected elements are <{http://companyxyz.com/xyz-xml/2.0/}searchResponse>
... 33 more

我不是 SOAP 专家,但假设这意味着他们响应中的名称空间与 wsdl 中定义的名称不匹配。

由于我的应用程序是用 java 编写的,因此我能够使用 commons http 客户端和手工制作的 SOAP 请求进行连接并获得响应,所以最坏的情况下我可以回退到那个并解析响应以获得我需要的东西。

我的问题:

  1. 我是否正确解释了异常?
  2. 如果没有:关于如何调试此问题的任何建议?
  3. 如果是:任何人都可以提出更好的替代方法来手动处理 http 请求和手动解析 xml 吗? (不幸的是,获得正确的 wsdl 不是一种选择)

提前致谢。

【问题讨论】:

  • 您是否尝试过将?wsdl 粘贴到端点URI 上?
  • 是的。不幸的是,它返回的 wsdl 与 Web 服务不太相似。

标签: java soap cxf


【解决方案1】:
  1. 很有可能。响应使用命名空间“http://us-labs.companyxyz.com/”,但在 WSDL 中,使用命名空间“http://companyxyz.com/xyz-xml/2.0/”声明了相同的元素。

  2. 我不熟悉 CXF,但其他 SOAP 框架通常提供某种日志记录功能。如果 SOAP 请求和响应记录在某处以进行更具体的分析,它可能会对您有所帮助。

  3. 为什么不能选择获得正确的 WSDL?如果您确实能够“手工制作”正确的 SOAP 请求并期望能够“手工解析”响应,那么您也应该能够自己编写 WSDL。当然,WSDL 应该由服务运营商提供给您,但如果您的意思是没有人能够为您提供正确的 WSDL,我会考虑自己编写,而不是手动创建和解析 SOAP 消息。

【讨论】:

  • 你是对的。我应该说服务运营商不太可能改变它,但我可以自己构建一个 wsdl。
【解决方案2】:

我认为您正确解释了异常 - 命名空间与预期不同。

这也并不出人意料。供应商提供的 wsdl 并不总是正确的,这是一个不争的事实。正是出于这个原因,我们实际上为供应商应用程序编写了自己的 WSDL 和 XSD。

您甚至可以在运行时使用自己的 WSDL。对此有一些 SO 问题,herehere

你也可以看看here。我没试过,但它可以工作。

我们实际上扩展了生成的服务并使用 JaxWS Service constructor 创建了一个端口来提供位于类路径上的 WSDL。这对我们来说很好。

我们通过转储传入和传出消息来调试 CXF。似乎有很多方法可以做到这一点。我们在 de Web 服务和我们的客户端之间使用代理,或者最近在某处使用 cxf.xml 文件。我们使用 -D 标志临时配置它。

-Dcxf.config.file=/home/me/cxf-debug.xml 

并且 cxf-debug.xml 包含 like:

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:cxf="http://cxf.apache.org/core"
      xsi:schemaLocation="
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <cxf:bus>
        <cxf:features>
            <cxf:logging/>
        </cxf:features>
    </cxf:bus> 
</beans>

http://cxf.apache.org/docs/debugging-and-logging.html

【讨论】:

  • 哇。感谢您的提示。我也会试试这些。似乎共识是自己编写 wsdl。
【解决方案3】:

两个回答都提出了相同的基本方法,结果证明是正确的。 我修复了提供的 wsdl 以使其与 Web 服务匹配,并且我能够使用 cxf,这为我节省了很多手动编码。

他们的 wsdl 的主要问题实际上是命名空间问题。问题的实质如下:他们的wsdl定义了两个命名空间,都有一个“searchResponse”元素。

{http://us-labs.companyxyz.com/}searchResponse

在 wsdl 中被定义为包含 0 个或多个

{http://companyxyz.com/xyz-xml/2.0/}searchResponse

但在他们的响应中,嵌套的 searchResponse 没有被 {http://companyxyz.com/xyz-xml/2.0/} 限定,因此 cxf 将其解释为 {http://us-labs.companyxyz.com/}searchResponse

我通过引入一种新类型来修复它。

感谢两位响应者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多