调试青海联通VAC接口,根据VAC SP接口规范1212中的wsdl文件,采用axis生成WebService服务,调试时发现青海联通VAC发送的请求解析老是出错:
2010-07-09 13:52:44,627[DEBUG]org.apache.axis.enterprise(325) - Mapping Exception to AxisFault
org.xml.sax.SAXException: Invalid element in com.unicom.vac.bossagent.soap.sync.req.OrderRelationUpdateNotifyRequest - userIdType
at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
后来通过axis的SOAPMonitor,发现联通给过来的VAC同步请求消息和规范中的wsdl定义不一样,修改了wsdl文件,重新生成WebService代码,再次测试成功。
修改后的wsdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:tns3="http://rsp.sync.soap.bossagent.vac.unicom.com" xmlns:impl="http://soap.bossagent.vac.unicom.com" xmlns:intf="http://soap.bossagent.vac.unicom.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns2="http://req.sync.soap.bossagent.vac.unicom.com" xmlns:tns4="http://type.sync.soap.bossagent.vac.unicom.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://soap.bossagent.vac.unicom.com">
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://req.sync.soap.bossagent.vac.unicom.com">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="OrderRelationUpdateNotifyRequest">
<sequence>
<element name="recordSequenceId" nillable="true" type="soapenc:string"/>
<element name="userIdType" nillable="true" type="soapenc:int"/>
<element name="userId" nillable="true" type="soapenc:string"/>
<element name="serviceType" nillable="true" type="soapenc:string"/>
<element name="spId" nillable="true" type="soapenc:string"/>
<element name="productId" nillable="true" type="soapenc:string"/>
<element name="updateType" nillable="true" type="soapenc:int"/>
<element name="updateTime" nillable="true" type="soapenc:string"/>
<element name="updateDesc" nillable="true" type="soapenc:string"/>
<element name="linkId" nillable="true" type="soapenc:string"/>
<element name="content" nillable="true" type="soapenc:string"/>
<element name="effectiveDate" nillable="true" type="soapenc:string"/>
<element name="expireDate" nillable="true" type="soapenc:string"/>
<element name="time_stamp" nillable="true" type="soapenc:string"/>
<element name="encodeStr" nillable="true" type="soapenc:string"/>
</sequence>
</complexType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://rsp.sync.soap.bossagent.vac.unicom.com">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="OrderRelationUpdateNotifyResponse">
<sequence>
<element name="recordSequenceId" nillable="true" type="soapenc:string"/>
<element name="resultCode" type="xsd:int"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="orderRelationUpdateNotifyRequest">
<wsdl:part name="orderRelationUpdateNotifyRequest" type="tns2:OrderRelationUpdateNotifyRequest"/>
</wsdl:message>
<wsdl:message name="orderRelationUpdateNotifyResponse">
<wsdl:part name="orderRelationUpdateNotifyReturn" type="tns3:OrderRelationUpdateNotifyResponse"/>
</wsdl:message>
<wsdl:portType name="SyncNotifySPService">
<wsdl:operation name="orderRelationUpdateNotify" parameterOrder="orderRelationUpdateNotifyRequest">
<wsdl:input name="orderRelationUpdateNotifyRequest" message="impl:orderRelationUpdateNotifyRequest"/>
<wsdl:output name="orderRelationUpdateNotifyResponse" message="impl:orderRelationUpdateNotifyResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SyncNotifySPSoapBinding" type="impl:SyncNotifySPService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="orderRelationUpdateNotify">
<wsdlsoap:operation/>
<wsdl:input>
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap.bossagent.vac.unicom.com"/>
</wsdl:input>
<wsdl:output>
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap.bossagent.vac.unicom.com"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SyncNotifySPServiceService">
<wsdl:port name="SyncNotifySP" binding="impl:SyncNotifySPSoapBinding">
<wsdlsoap:address location="http://localhost/services/VacSync"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
规范中的wsdl文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:tns3="http://rsp.sync.soap.bossagent.vac.unicom.com" xmlns:impl="http://soap.bossagent.vac.unicom.com" xmlns:intf="http://soap.bossagent.vac.unicom.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns2="http://req.sync.soap.bossagent.vac.unicom.com" xmlns:tns4="http://type.sync.soap.bossagent.vac.unicom.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://soap.bossagent.vac.unicom.com">
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://req.sync.soap.bossagent.vac.unicom.com">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ArrayOf_tns2_SubInfo">
<sequence>
<element maxOccurs="unbounded" minOccurs="1" name="item" type="tns2:SubInfo"/>
</sequence>
</complexType>
<complexType name="OrderRelationUpdateNotifyRequest">
<sequence>
<element name="recordSequenceId" nillable="true" type="soapenc:string"/>
<element name="subNotify" type="tns2:ArrayOf_tns2_SubInfo"/>
</sequence>
</complexType>
<complexType name="SubInfo">
<sequence>
<element name="userIdType" nillable="true" type="soapenc:int"/>
<element name="userId" nillable="true" type="soapenc:string"/>
<element name="serviceType" nillable="true" type="soapenc:string"/>
<element name="spId" nillable="true" type="soapenc:string"/>
<element name="sp_productId" nillable="true" type="soapenc:string"/>
<element name="updateType" nillable="true" type="soapenc:int"/>
<element name="updateTime" nillable="true" type="soapenc:string"/>
<element name="updateDesc" nillable="true" type="soapenc:string"/>
<element name="linkId" nillable="true" type="soapenc:string"/>
<element name="content" nillable="true" type="soapenc:string"/>
<element name="effectiveDate" nillable="true" type="soapenc:string"/>
<element name="expireDate" nillable="true" type="soapenc:string"/>
<element name="time_stamp" nillable="true" type="soapenc:string"/>
<element name="encodeStr" nillable="true" type="soapenc:string"/>
<element name="accessNo" nillable="true" type="soapenc:string"/>
</sequence>
</complexType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://rsp.sync.soap.bossagent.vac.unicom.com">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="OrderRelationUpdateNotifyResponse">
<sequence>
<element name="recordSequenceId" nillable="true" type="soapenc:string"/>
<element name="resultCode" type="xsd:int"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="orderRelationUpdateNotifyRequest">
<wsdl:part name="orderRelationUpdateNotifyRequest" type="tns2:OrderRelationUpdateNotifyRequest"/>
</wsdl:message>
<wsdl:message name="orderRelationUpdateNotifyResponse">
<wsdl:part name="orderRelationUpdateNotifyReturn" type="tns3:OrderRelationUpdateNotifyResponse"/>
</wsdl:message>
<wsdl:portType name="SyncNotifySPService">
<wsdl:operation name="orderRelationUpdateNotify" parameterOrder="orderRelationUpdateNotifyRequest">
<wsdl:input name="orderRelationUpdateNotifyRequest" message="impl:orderRelationUpdateNotifyRequest"/>
<wsdl:output name="orderRelationUpdateNotifyResponse" message="impl:orderRelationUpdateNotifyResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SyncNotifySPSoapBinding" type="impl:SyncNotifySPService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="orderRelationUpdateNotify">
<wsdlsoap:operation/>
<wsdl:input>
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap.bossagent.vac.unicom.com"/>
</wsdl:input>
<wsdl:output>
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap.bossagent.vac.unicom.com"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SyncNotifySPServiceService">
<wsdl:port name="SyncNotifySP" binding="impl:SyncNotifySPSoapBinding">
<wsdlsoap:address location="http://localhost/services/VacSync"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
联通VAC接口发过来的WebService请求消息如下:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:orderRelationUpdateNotify
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://soap.bossagent.vac.unicom.com">
<orderRelationUpdateNotifyRequest href="#id0" target="_blank" rel="external nofollow" />
</ns1:orderRelationUpdateNotify>
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xsi:type="ns2:OrderRelationUpdateNotifyRequest"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns2="http://req.sync.soap.bossagent.vac.unicom.com">
<recordSequenceId xsi:type="soapenc:string">201007091357162383</recordSequenceId>
<userIdType href="#id1" target="_blank" rel="external nofollow" />
<userId xsi:type="soapenc:string">8613007794250</userId>
<serviceType xsi:type="soapenc:string">31</serviceType>
<spId xsi:type="soapenc:string">84407</spId>
<productId xsi:type="soapenc:string">3170003901</productId>
<updateType href="#id2" target="_blank" rel="external nofollow" />
<updateTime xsi:type="soapenc:string">20100709135716</updateTime>
<updateDesc xsi:type="soapenc:string"/>
<linkId xsi:type="soapenc:string"/>
<content xsi:type="soapenc:string">Qxc</content>
<effectiveDate xsi:type="soapenc:string">20100709135536</effectiveDate>
<expireDate xsi:type="soapenc:string">20100709135716</expireDate>
<time_stamp xsi:type="soapenc:string">0709135716</time_stamp>
<encodeStr xsi:type="soapenc:string">fcbf28f61d4182ba72946a494a172801</encodeStr>
</multiRef>
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:int"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
1
</multiRef>
<multiRef id="id2" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:int"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
2
</multiRef>
</soapenv:Body>
</soapenv:Envelope>
问了一下青海联通,他们的VAC是华为做的,而且很多业务已经在跑了,真的搞不明白他们怎么调试通过的?
也许是我拿到的wsdl文件就不对,或是他们按照http+xml去自行解析了?
当然这个问题没出去说,也找不到华为的兄弟来讨论,既然已经有那么多业务在跑了,即使是他们未按照正确的规范来做现在也不能改了。
只不过希望使用WebService来做规范的开发人员以后一定要按照规范来做,否则还采用WebService干嘛呢,徒增许多麻烦。