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

Soap不会将响应字段强制转换为类型化对象,soap,xsd,wsdl,Soap,Xsd,Wsdl,我是一个SOAP新手,被指派去复活一个旧的SOAP接口。我已将soap服务以新路径移植到新的tomcat上(并保持客户端不变)。我发出请求: http://myserver:8181/soap/SoapTest?wsdl 我回来了: <wsdl:definitions xmlns:ns1="http://webservices.mycompany.com" xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/http" xml

我是一个SOAP新手,被指派去复活一个旧的SOAP接口。我已将soap服务以新路径移植到新的tomcat上(并保持客户端不变)。我发出请求: http://myserver:8181/soap/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 name:type关联,但似乎没有或没有应用它们。那就是

嗯。。经过审查,我看到xs被用作名称空间,但xmlns:xsd被定义了??这是怎么发生的

ZSI客户端查询(如果有任何区别,请从Windows)到此接口(Linux)接收包含预期数据负载的响应,但随后将每个数据项映射到单个“属性”中,从而生成一个通用属性列表

我希望有一个类型化成员的列表,每个属性都转换为它的xs类型(例如上面的int、long、string、string),对吗


提前感谢您提供的任何线索

来自ZSI文档:

如果调用的操作返回ComplexType,则必须提供类型码信息,以便告诉ZSI如何反序列化响应

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


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

鉴于您没有为手头的实际问题提供足够的信息,我将以您是新手为基础,因此,请将我的回答围绕我认为与你的问题相关的部分

您的主要web服务在WSDLhttp://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>

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

鉴于此处提供的信息量,我很惊讶您会得到“足够的关注”:。。。用于名称空间别名的xs与xsd不相关:如果给定代码段中xsd前缀似乎多余,那么名称空间似乎使用正确。我建议用其他信息更新您的问题;可能是一个XML片段,一个关于如何将其转换为“单个属性”的描述,以及实际上类型化成员的列表——基本上是一些代码。更多的WSDL将是有益的。。。不知何故,我怀疑您的SOAP绑定在这里是RPC…位图,谢谢您的澄清。我将进一步了解ZSI文档;在我看来,是绑定部分不起作用。用户,还没有机会在代码中对此进行跟踪,但您的评论似乎提供了希望。。谢谢这是几乎所有SOAP框架上的最佳方式。使用WSDL生成强类型的类,并使框架将XML响应转换为该类。
 <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>