Miks ei tunnista veebiteenuse aruandlusserver, mis kutsub C#, HTTP päise SOAPActioni väärtust ja laseb C#-il seda alati muuta, ainult sellepärast, et C# peab lisama ainult silti, miks ei saa JAVA määrata tegevustaotlust?
Veebiteenuse avaldamine ja kutsumine on väga lihtne, kuid on siiski väiksemaid probleeme, mis on kokku võetud järgmiselt:
Java kutsub .net webService'i veaga "Server ei tuvastanud HTTP päise SOAPActioni väärtust".
Lahus:
Veebiteenuse kutsumisel ei ole SoapActionit määratud, RequestNameSpace'i ei määrata, seega ilmub alati taotlusel "Server ei tuvastanud HTTP päise SOAPActioni väärtust".
Kui kasutatakse teljekutseid, kutsu neid järgmiselt:
public static void main(String[] args) viskab Erandi { Ei too? WSDL järelliide String endpoint = "http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx"; Loo teenusekõne Teenistus = uus teenistus(); Loo kõneobjekt teenuse kaudu Call call = (Call) service.createCall(); Määrake URL, kus teenus asub call.setTargetEndpointAddress(new java.net.URL(endpoint)); qqCheckOnline on meetod "http://WebXml.com.cn/" võrgupoolel, mis pöörab tähelepanu ka nimeruumi aadressile ning teatab veast, kui sa seda ei too call.setOperationName(new QName("http://WebXml.com.cn/","qqCheckOnline")); qqCode on ka .NET meetodi parameetrinimi, mis on qqCheckOnline parameetri nimi call.addParameter(new QName("http://WebXml.com.cn/","qqCode"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); Vältige, et Java kutsub .net veebiteenust veateatega "Server ei tuvastanud HTTP päise SOAPActioni väärtust" call.setUseSOAPAction(true); call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING); Tagastatud parameetri tüüp call.setSOAPActionURI("http://WebXml.com.cn/qqCheckOnline"); Samuti tuleb märkida, et pead lisama kutsutava meetodi, vastasel juhul teatatakse ka vea Objektimassiivid kapseldavad parameetrid String ret = (String) call.invoke(uus objekt[] {"aaaaa"}); System.out.println("--------"+ret); } Pane tähele kommentaaride sektsiooni.
Hüperlingi sisselogimine on nähtav.? WSDL tähendab avalikku veebiteenust
Järgmine erand tekib siis, kui CXF-i kasutav wsdl2java.bat genereerib kliendi .net veebiteenuse avaldamiseks wsdl-faili põhjal
( määratlemata elemendi deklaratsioon 's:schema') Lahus:
Ava wsdl.xml ja kasuta
<s:any minOccurs="2" maxOccurs="2"/>Alternatiivne <s:element ref="s:schema" /><s:any /> See wsdl2java genereerimisviga peaks olema seotud sellega, et JAXB ei toeta xml viiteid, sest <s:any minOccurs="2" maxOccurs="2"/> ja <s:element ref="s:schema" /><s:any/> on tegelikult ekvivalentsed. <s:element ref="s:schema" /> tähendab tegelikult, et siin saab kasutada mis tahes s:schema määratud elemenditüüpi, <s:any /> täidab seda rolli, <s:any minOccurs="2" maxOccurs="2"/> on lihtsalt kaks <s:any /> See oli lihtsalt ühe lausega kirjas.
viideHüperlingi sisselogimine on nähtav.
CXF wsdl2java.bat kasutamine tekitab kliendi kompileerimise supervea wsdl faili põhjal
Lahus:
See ei kompileerita korralikult, kuna jax-ws2.2 spetsifikatsioon on vastuolus java6-ga.
Kuid programmi ei saa kompileerida ainult java5-s, seega on vaja vähendada jax-ws spetsifikatsiooni versiooni, mida saab käsitleda järgmiselt: Käivita käsk
wsdl2java -frontend jaxws21 -client *.xml Nii saab jax-ws2.1-ga genereeritud koodi kompileerida ja käivitada java6-s.
Võrdlesin tööriista poolt genereeritud kliendikoodi tekstivõrdlusega ja leidsin, et viimane genereeris veel 3 kliendikoodi, nii et kolme konstruktori eemaldamine, kes vigu teatasid, võib samuti lahendada ülaltoodud probleemid.
Trükitud allikast:Hüperlingi sisselogimine on nähtav.
|