使用不正确的wsdl访问SOAP Web服务

时间:2011-05-20 11:30:40

标签: java soap cxf

背景:

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

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

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

 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请求进行连接并获得响应,因此最糟糕的情况是我可以回退并解析响应以获得我需要的内容。 / p>

我的问题:

  1. 我是否正确解释了异常?
  2. 如果不是:有关如何调试的建议吗?
  3. 如果是的话:任何人都可以提出更好的替代方案来手工制作http请求并手动解析xml吗? (遗憾的是,获取正确的wsdl不是一种选择)
  4. 提前致谢。

3 个答案:

答案 0 :(得分:0)

  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消息。

答案 1 :(得分:0)

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

这也不是意料之外的事。供应商提供的wsdls并不总是正确的,这是生活中的事实。实际上,我们为供应商应用程序编写了自己的WSDL和XSD。

您甚至可以使用自己的WSDL运行时。对此有一些问题,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

答案 2 :(得分:0)

两个回复都提出了相同的基本方法,结果证明是正确的方法。 我修复了提供的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

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

感谢两位回应者。