Miksi webservice-raportointipalvelin, joka kutsuu C#:ää, ei tunnista http-otsikon SOAPActionin arvoa ja antaa aina C#:n muuttaa sitä, vaikka C# tarvitsee vain lisätä tunnisteen, miksi JAVA ei voi määrittää toimenpidepyyntöä?
Webservicen julkaiseminen ja kutsuminen on hyvin yksinkertaista, mutta on silti pieniä ongelmia, jotka on tiivistetty seuraavasti:
Java kutsuu .netin webServiceä virheellä "Server failed to recognized the value of HTTP header SOAPAction".
Ratkaisu:
Kun kutsutaan webserviceä, SoapActionia ei määritetä, eikä RequestNameSpacea, joten "Palvelin ei tunnistanut HTTP-otsikon arvoa SOAPAction" ilmestyy aina pyynnön yhteydessä.
Jos käytät akselikutsuja, kutsu ne seuraavasti:
public static void main(String[] args) heittää Exception { Et tuo mukaan? WSDL-päätte Merkkijonon päätepiste = "http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx"; Luo palvelukutsu Palvelupalvelu = uusi Palvelu(); Luo kutsuobjekti palvelun kautta Call call = (Call) service.createCall(); Aseta URL-osoite, jossa palvelu sijaitsee call.setTargetEndpointAddress (uusi java.net.URL(päätepiste)); qqCheckOnline on metodi "http://WebXml.com.cn/" verkkopuolella, joka myös kiinnittää huomiota nimiavaruuden osoitteeseen ja raportoi virheen, jos et tuo sitä call.setOperationName(new QName("http://WebXml.com.cn/","qqCheckOnline")); qqCode on myös .NET-metodin parametrinimi, joka on myös qqCheckOnlinen parametrin nimi call.addParameter(uusi QName("http://WebXml.com.cn/","qqCode"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN); Vältä Javan kutsua .netin webServiceen virheellä "The server failed to recognition the value of HTTP header SOAPAction" call.setUseSOAPAction(true); call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING); Palautettujen parametrien tyyppi call.setSOAPActionURI("http://WebXml.com.cn/qqCheckOnline"); Tämä on myös huomioitava, että sinun täytyy lisätä kutsuttava metodi, muuten virhe raportoidaan myös Objektitaulukot kapseloivat parametrit String ret = (String) call.invoke(new Object[] {"aaaaa"}); System.out.println("--------"+ret); } Huomaa kommenttiosio.
Hyperlinkin kirjautuminen on näkyvissä.? WSDL tarkoittaa julkista verkkopalvelua
Seuraava poikkeus esiintyy, kun CXF:ää käyttävä wsdl2java.bat luo asiakkaan julkaistakseen .net-web-palvelun wsdl-tiedoston pohjalta
( määrittelemätön elementtimääritys 's:schema') Ratkaisu:
Avaa wsdl.xml ja käytä
<s:any minOccurs="2" maxOccurs="2"/>Vaihtoehtoinen <s:element ref="s:schema" /><s:any /> Tämän wsdl2java-generointivirheen pitäisi liittyä siihen, että JAXB ei tue xml-viitteitä, koska <s:any minOccurs="2" maxOccurs="2"/> ja <s:element ref="s:schema" /><s:any/> ovat itse asiassa ekvivalentteja. <s:element ref="s:schema" /> tarkoittaa itse asiassa, että voit käyttää mitä tahansa s:schema-tyyppiä, <s:any /> toimii tässä roolissa, <s:any minOccurs="2" maxOccurs="2"/> on vain kaksi <s:any /> Se oli kirjoitettu yhdellä lauseella.
viittausHyperlinkin kirjautuminen on näkyvissä.
CXF:n wsdl2java.bat tuottaa asiakkaan käännössupervirheen wsdl-tiedoston perusteella
Ratkaisu:
Se ei käänny oikein, koska jax-ws2.2-määrittely on ristiriidassa java6:n kanssa.
Ohjelmaa ei kuitenkaan voi kääntää pelkästään java5:llä, joten jax-ws-määrittelyn versio on tarpeen alentaa, ja se voidaan käsitellä näin: Suorita komento
wsdl2java -frontend jaxws21 -client *.xml Näin jax-ws2.1:llä generoitu koodi voidaan kääntää ja suorittaa java6:lla.
Vertailin työkalun tuottamaa asiakaskoodia tekstivertailuun ja huomasin, että jälkimmäinen tuotti kolme lisäasiakaskoodia, joten kolmen virheilmoituksen tehneen konstruktorin poistaminen voi myös ratkaista yllä mainitut ongelmat.
Uudelleenpainettu lähteestä:Hyperlinkin kirjautuminen on näkyvissä.
|