Soap不会将响应字段强制转换为类型化对象

时间:2012-04-11 18:05:59

标签: soap xsd wsdl

我是一个分配给复活旧肥皂界面的SOAP新手。我已将soap服务移植到新路径上的新tomcat上(并保持客户端不变)。我发送请求:   的的http:// MYSERVER:8181 /肥皂/ SoapTest WSDL 我回来了:

  <wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
    xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/http"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.mycompany.com/SoapTest"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    name="SoapTestService" 
    targetNamespace="http://www.mycompany.com/SoapTest">

    <wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com"></wsdl:import>
    <wsdl:binding name="SoapTestServiceSoapBinding" type="ns1:SoapTest">...</wsdl:binding>
    <wsdl:service name="SoapTestService">...</wsdl:service>
  </wsdl:definitions>

似乎很有希望。对导入位置 SoapTest?wsdl = SoapTest.wsdl 的请求会返回:

<wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
  xmlns:ns2="http://jaxb.dev.java.net/array" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  name="SoapTest"
  targetNamespace="http://webservices.mycompany.com">
  <wsdl:types>
    <xs:schema xmlns:tns="http://webservices.mycompany.com"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://webservices.mycompany.com" version="1.0">
    <xs:complexType name="sessionObj">
      <xs:sequence>
        <xs:element name="code" type="xs:int"/>
        <xs:element name="id" type="xs:long"/>
        <xs:element minOccurs="0" name="role" type="xs:string"/>
        <xs:element minOccurs="0" name="username" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    ... (and so on)

因此客户端可以接收成员xs名称:类型关联但似乎不是 - 或者不应用它们。那是......

HUH ..经过审核,我看到xs被用作命名空间但是xmlns:xsd被定义了?怎么会发生这种情况?

ZSI客户端查询(从Windows,如果这有什么不同)到此接口(Linux)接收包含预期数据有效负载的响应,但随后将每个数据项映射到单独的“属性” - 产生通用属性列表。

我期待一个类型化成员列表,每个属性都转换为xs类型(例如int,long,string,上面的字符串),对吗?

提前感谢任何线索。

2 个答案:

答案 0 :(得分:1)

鉴于您没有提供足够的信息来解决当前的实际问题,我将基于您是 newb 的基础,因此将我的答案包含在我发现的相关部分中你的问题。

您的主要Web服务在WSDL http:// myserver:8181 / soap / SoapTest?wsdl 中描述,它包含对父WSDL的导入。此父WSDL包含可由主服务绑定的服务定义。

  

似乎很有希望。对导入位置的请求   SoapTest?wsdl = SoapTest.wsdl返回:   ..

从上面提供的文档定义中,导入:

<wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com">
</wsdl:import>

注入父 WSDL 文件,该文件包含与您的服务相关的所有元素和属性的架构定义。这意味着对它进行独立调用,将显示xs命名空间定义。有关架构和数据类型的更多信息,请参阅here

   HUH ..经过审核,我看到xs被用作命名空间但xmlns:xsd   定义?怎么会发生这种情况?

是的,架构不是作为单独的文件定义的,而是作为 WSDL 的一部分定义的。它在<wsdl:types>标记之间定义:

 <wsdl:types>
       <xs:schema xmlns:tns="http://webservices.mycompany.com" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://webservices.mycompany.com" version="1.0">
   [..]
 </wsdl:types>

有关ZSI绑定和存根生成的更多信息,请参阅here

答案 1 :(得分:0)

来自ZSI文档:

如果调用的操作返回ComplexType,则必须提供typecode信息,以告知ZSI如何反序列化响应。

为了让ZSI透明地将返回的复杂类型反序列化为Person实例,必须将定义类及其类型代码的模块附加到ZSI.Path列表。通过将类作为参数传递给Binding.Receive()方法,也可以显式告诉ZSI使用哪个类和类型代码。第一种方法通常是首选方法,特别是对于公开​​分布的库。

从WSDL和XML Schema生成代码是ZSI提供访问WSDL服务的第二种方式。给定WSDL服务的路径,生成两个文件,一个“服务”文件和一个“类型”文件,然后可以使用它们来访问服务。