Pozivanje SOAP web usluge na Javi

1. Pregled

U ovom vodiču, naučit ćemo kako izgraditi SOAP klijenta u Javi s JAX-WS RI. Prvo ćemo generirati klijentski kod koristeći wsimport uslužni program, a zatim ga testirajte pomoću JUnit-a.

Za one koji počinju, naš uvod u JAX-WS pruža sjajnu pozadinu o toj temi.

2. Web usluga

Prije nego što počnemo graditi klijenta, potreban nam je poslužitelj. U ovom slučaju, poslužitelj koji izlaže JAX-WS web uslugu.

U svrhu ovog vodiča koristit ćemo web uslugu koja će nam donijeti podatke o državi, s obzirom na njezino ime.

2.1. Sažetak provedbe

Budući da smo se usredotočili na izgradnju klijenta, nećemo ulaziti u detalje implementacije naše usluge.

Dovoljno je reći da sučelje CountryService koristi se za izlaganje web usluge vanjskom svijetu. Da stvari budu jednostavne, izradit ćemo i implementirati web uslugu pomoću javax.xml.ws.Endpoint API u našoj klasi CountryServicePublisher.

Mi ćemo trčati CountryServicePublisher kao Java program za objavljivanje krajnje točke koja će prihvatiti dolazne zahtjeve. Drugim riječima, ovo će biti naš poslužitelj.

Nakon pokretanja poslužitelja pritisnite URL // localhost: 8888 / ws / country? wsdl daje nam datoteku opisa web usluge. WSDL djeluje kao vodič za razumijevanje ponuda usluge i generiranje implementacijskog koda za klijenta.

2.2. Jezik opisa web usluga

Pogledajmo WSDL naše web usluge, zemlja:

Ukratko, ovo su korisne informacije koje pruža:

  • možemo se pozvati na metodu findByName s niz argument
  • kao odgovor, usluga će nam vratiti prilagođenu vrstu zemlja
  • tipovi su definirani u xsd shema generirana na mjestu // localhost: 8888 / ws / country? xsd = 1:

To je sve što nam treba za implementaciju klijenta.

Pogledajmo kako u sljedećem odjeljku.

3. Korištenje wsimport za generiranje klijentskog koda

3.1. Dodatak Maven

Prvo, dodajmo dodatak našem pom.xml da biste koristili ovaj alat putem Mavena:

 org.codehaus.mojo jaxws-maven-plugin 2.6 wsimport-from-jdk wsimport // localhost: 8888 / ws / country? wsdl true com.baeldung.soap.ws.client.generated src / main / java 

Drugo, izvršimo ovaj dodatak:

mvn clean jaxws: wsimport

To je sve! Gornja naredba generirat će kôd u navedenom paketu com.baeldung.soap.ws.client.generated unutar sourceDestDir dali smo u konfiguraciji dodatka.

Drugi način da se to postigne bio bi korištenje wsimport korisnost. Dolazi iz standardne distribucije JDK 8 i može se naći pod JAVA_HOME / bin imenik.

Za generiranje klijentskog koda pomoću wsimport, možemo doći do korijena projekta i pokrenuti ovu naredbu:

JAVA_HOME / bin / wsimport -s src / main / java / -keep -p com.baeldung.soap.ws.client.generated "// localhost: 8888 / ws / country? Wsdl"

Važno je imati na umu da bi krajnja točka usluge trebala biti dostupna kako bi se uspješno izvršilo dodatak ili naredba.

Dalje, pogledajmo generirane artefakte.

3.2. Generirani POJO

Bazirano na xsd vidjeli smo ranije, alat će generirati datoteku s imenom Zemlja.java:

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "country", propOrder = {"capital", "currency", "name", "populacija"}) javna klasa Država {zaštićen String capital; @XmlSchemaType (name = "string") zaštićena valuta valute; zaštićeni naziv niza; zaštićeno int stanovništvo; // standardni geteri i postavljači}

Kao što vidimo, generirana klasa ukrašena je JAXB bilješkama za marširanje i uklanjanje marširanja objekta u i iz XML-a.

Također, generira a Valuta nabrajanje:

@XmlType (name = "currency") @XmlEnum javni popis Valuta {EUR, INR, USD; javna vrijednost niza () {return ime (); } javna statička valuta fromValue (String v) {return valueOf (v); }}

3.3. CountryService

Drugi generirani artefakt je sučelje koje djeluje kao proxy stvarne web usluge.

Sučelje CountryService deklarira istu metodu kao i naš poslužitelj, findByName:

@WebService (name = "CountryService", targetNamespace = "//server.ws.soap.baeldung.com/") @SOAPBinding (style = SOAPBinding.Style.RPC) @XmlSeeAlso ({ObjectFactory.class}) javno sučelje CountryService { @WebMethod @WebResult (partName = "return") @Action (input = "//server.ws.soap.baeldung.com/CountryService/findByNameRequest", output = "//server.ws.soap.baeldung.com/CountryService / findByNameResponse ") javna zemlja findByName (@WebParam (name =" arg0 ", partName =" arg0 ") Niz arg0); }

Značajno je da je sučelje označeno kao javax.jws.WebService, s UVEZAVANJE SAPUNA.Stil kao RPC kako je definirano WSDL-om usluge.

Metoda findByName s napomenom izjavljuje da je to javax.jws.WebMethod, s očekivanim vrstama ulaznih i izlaznih parametara.

3.4. CountryServiceImplService

Naš sljedeći generirani tečaj, CountryServiceImplService, proteže se javax.xml.ws.Service. Njegova bilješka WebServiceClient označava da je to klijentov pogled usluge:

@WebServiceClient (name = "CountryServiceImplService", targetNamespace = "//server.ws.soap.baeldung.com/", wsdlLocation = "// localhost: 8888 / ws / country? Wsdl") javna klasa CountryServiceImplService proširuje uslugu {private final statički URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; privatni konačni statički WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; privatno završno statičko QName COUNTRYSERVICEIMPLSERVICE_QNAME = novo QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplService"); static {URL url = null; WebServiceException e = null; isprobajte {url = novi URL ("// localhost: 8888 / ws / country? wsdl"); } catch (MalformedURLException ex) {e = novi WebServiceException (ex); } COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; } javna CountryServiceImplService () {super (__ getWsdlLocation (), COUNTRYSERVICEIMPLSERVICE_QNAME); } // ostali konstruktori @WebEndpoint (name = "CountryServiceImplPort") public CountryService getCountryServiceImplPort () {return super.getPort (new QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService. razred); } privatni statički URL __getWsdlLocation () {if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION! = null) {throw COUNTRYSERVICEIMPLSERVICE_EXCEPTION; } vratiti COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; }}

Ovdje je važna metoda koju treba primijetiti getCountryServiceImplPort. S obzirom na kvalificirano ime krajnje točke usluge ili QNamei naziv sučelja usluge dinamičke proxy službe, vraća instancu proxyja.

Kako bismo pozvali web uslugu, trebamo upotrijebiti ovaj proxy, kao što ćemo uskoro vidjeti.

Korištenjem proxyja čini se kao da lokalno zovemo uslugu, apstrahirajući zamršenost daljinskog pozivanja.

4. Testiranje klijenta

Dalje ćemo napisati JUnit test za povezivanje s web uslugom pomoću generiranog klijentskog koda.

Prije nego što to učinimo, na kraju klijenta moramo dobiti instancu proxyja usluge:

@BeforeClass javna statička void postavka () {CountryServiceImplService service = new CountryServiceImplService (); CountryService countryService = service.getCountryServiceImplPort (); }

Za naprednije scenarije poput omogućavanja ili onemogućavanja a WebServiceFeature, možemo koristiti druge generirane konstruktore za CountryServiceImplService.

Pogledajmo sada nekoliko testova:

@Test javna praznina givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi () {assertEquals ("New Delhi", countryService.findByName ("India"). GetCapital ()); } @Test javna praznina givenCountryService_whenCountryFrance_thenPopulationCorrect () {assertEquals (66710000, countryService.findByName ("Francuska"). GetPopulation ()); } @Test javna praznina givenCountryService_whenCountryUSA_thenCurrencyUSD () {assertEquals (Currency.USD, countryService.findByName ("USA"). GetCurrency ()); } 

Kao što vidimo, pozivanje metoda udaljene usluge postalo je jednostavno kao i lokalno pozivanje metoda. Proxy-jevi findByName metoda je vratila a Zemlja primjerak koji odgovara Ime osigurali smo. Zatim smo koristili razne dobivatelje POJO-a za utvrđivanje očekivanih vrijednosti.

5. Zaključak

U ovom uputstvu vidjeli smo kako pozvati SOAP web uslugu u Javi pomoću JAX-WS RI i wsimport korisnost.

Kao isto, možemo koristiti i druge JAX-WS implementacije poput Apache CXF, Apache Axis2 i Spring.

Kao i uvijek, izvorni kod dostupan je na GitHub-u.