我需要使用现有的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>
提前致谢。
答案 0 :(得分:0)
最有可能。响应使用命名空间“http://us-labs.companyxyz.com/”,但在WSDL中,使用命名空间“http://companyxyz.com/xyz-xml/2.0/”声明了相同的元素。
我不熟悉CXF,但其他SOAP框架通常提供某种日志记录功能。如果将SOAP请求和响应记录在某处以进行更具体的分析,它可能会对您有所帮助。
为什么不能选择正确的WSDL?如果您真的能够“手工”正确的SOAP请求并期望能够“手动”处理响应,那么您也应该能够自己编写WSDL。当然,WSDL应该由服务运营商提供给你,但是如果你的意思是没有人能够为你提供正确的WSDL,我会考虑自己编写它而不是手动创建和解析SOAP消息。
答案 1 :(得分:0)
我认为您正确解释了异常 - 命名空间与预期不同。
这也不是意料之外的事。供应商提供的wsdls并不总是正确的,这是生活中的事实。实际上,我们为供应商应用程序编写了自己的WSDL和XSD。
您甚至可以使用自己的WSDL运行时。对此有一些问题,here和here。
您还可以查看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>
答案 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
我通过引入一种新类型来修复它。
感谢两位回应者。