Soap不会将响应字段强制转换为类型化对象
我是一个SOAP新手,被指派去复活一个旧的SOAP接口。我已将soap服务以新路径移植到新的tomcat上(并保持客户端不变)。我发出请求: http://myserver:8181/soap/SoapTest?wsdl 我回来了: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
<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>