【 以下文字转载自 Java 讨论区 】
发信人: iTerry (Chelsea Captain), 信区: Java
标 题: Axis客户端调用XFire Web Service的相关问题
发信站: 水木社区 (Tue Nov 24 15:10:18 2009), 站内
Web Service函数定义:
public Boolean getPermission(Map<String, Object> params);
用Axis 1.4写的客户端调用程序:
public static void main(String[] args) {
try {
String endpoint = "http://x.x.x.x:xx/xxxx/ServiceName";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("getPermission");
Map<String, Object> params = new HashMap<String, Object>();
params.put("abc", "123");
params.put("def", "456");
Object ret = call.invoke(new Object[] { params });
System.out.println("Sent '" + params + "', got '" + ret + "'");
} catch (Exception e) {
System.err.println(e.toString());
}
}
用上面的客户端代码调用Axis 1.4实现的Web Service,没有问题,可以成功得到Map参数内容,并返回Boolean对象。Axis生成的WSDL如下(节选):
<wsdl:definitions>
<types>
<schema>
<complexType name="mapItem">
<sequence>
<element name="key" nillable="true" type="xsd:anyType" />
<element name="value" nillable="true" type="xsd:anyType" />
</sequence>
</complexType>
<complexType name="Map">
<sequence>
<element name="item" minOccurs="0" maxOccurs="unbounded" type="apachesoap:mapItem" />
</sequence>
</complexType>
</schema>
</types>
<wsdl:message name="getPermissionRequest">
<wsdl:part name="params" type="apachesoap:Map" />
</wsdl:message>
<wsdl:message name="getPermissionResponse">
<wsdl:part name="getPermissionReturn" type="soapenc:boolean" />
</wsdl:message>
<wsdl:portType name="ServiceName">
<wsdl:operation name="getPermission" parameterOrder="params">
<wsdl:input name="getPermissionRequest" message="impl:getPermissionRequest" />
<wsdl:output name="getPermissionResponse" message="impl:getPermissionResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceNameSoapBinding" type="impl:ServiceName">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getPermission">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="getPermissionRequest">
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://service.zhxxfw.urpsoft.com" />
</wsdl:input>
<wsdl:output name="getPermissionResponse">
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://x.x.x.x:xx/services/ServiceName" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServiceNameService">
<wsdl:port name="ServiceName" binding="impl:ServiceNAmeSoapBinding">
<wsdlsoap:address location="http://x.x.x.x:xx/services/ServiceName" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
然而用同样的客户端代码调用XFire 1.2.6写的Web Service,就会出问题。
调用时,XFire Web Service端报Exception:
IndexOutOfBoundsException: Index: 1, Size: 1
XFire生成的WSDL如下(节选):
<wsdl:definitions>
<wsdl:types>
<xsd:schema>
<xsd:complexType name="anyType2anyTypeMap">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="entry">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="0" name="key" type="xsd:anyType" />
<xsd:element maxOccurs="1" minOccurs="0" name="value" type="xsd:anyType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="getPermission">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="tns:anyType2anyTypeMap" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="getPermissionResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:boolean" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="getPermissionResponse">
<wsdl:part name="parameters" element="tns:getPermissionResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPermissionRequest">
<wsdl:part name="parameters" element="tns:getPermission">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ServiceNamePortType">
<wsdl:operation name="getPermission">
<wsdl:input name="getPermissionRequest" message="tns:getPermissionRequest">
</wsdl:input>
<wsdl:output name="getPermissionResponse" message="tns:getPermissionResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ServiceNameHttpBinding" type="tns:ServiceNamePortType">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getPermission">
<wsdlsoap:operation soapAction="" />
<wsdl:input name="getPermissionRequest">
<wsdlsoap:body use="literal" />
</wsdl:input>
<wsdl:output name="getPermissionResponse">
<wsdlsoap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ServiceName">
<wsdl:port name="ServiceNameHttpPort" binding="tns:ServiceNameHttpBinding">
<wsdlsoap:address location="http://x.x.x.x:xx/services/ServiceName" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
客户端是给一个门户网站用的,会有很多子系统来门户网站注册自己的Web Service,供门户调用。目前已经有不少用Axis1.4搭建的子系统Web Service上线运行了,因此如果需要修改客户端调用代码,则必须保证能够正常调用这些已有的Web Service。
并且,作为门户来讲,Web Service调用部分的代码只能把Web Service地址作为参数传进去,代码的其它部分不能因为调用的Service不同而有所不同,所以,每注册一个子系统Web Service就新生成一段客户端代码的做法是不现实的。
求大侠指教!
--
FROM 58.207.156.*