Vyvolanie webovej služby SOAP v prostredí Java

1. Prehľad

V tomto návode Naučíme sa, ako vytvoriť klienta SOAP v Jave pomocou JAX-WS RI. Najskôr vygenerujeme kód klienta pomocou znaku wsimport obslužný program a potom ho otestujte pomocou JUnit.

Pre tých, ktorí začínajú, náš úvod do JAX-WS poskytuje skvelé pozadie tejto témy.

2. Webová služba

Predtým, ako začneme budovať klienta, potrebujeme server. V tomto prípade server vystavujúci webovú službu JAX-WS.

Na účely tohto tutoriálu budeme používať webovú službu, ktorá nám načíta údaje o krajine podľa jej názvu.

2.1. Zhrnutie implementácie

Pretože sa zameriavame na budovanie klienta, nebudeme sa venovať podrobnostiam implementácie našej služby.

Povedzme si dosť, že rozhranie CountryService sa používa na vystavenie webovej služby vonkajšiemu svetu. Aby to nebolo jednoduché, vytvoríme a nasadíme webovú službu pomocou javax.xml.ws.Endpoint API v našej triede CountryServicePublisher.

Zbehneme CountryServicePublisher ako Java aplikácia na zverejnenie koncového bodu, ktorý bude prijímať prichádzajúce požiadavky. Inými slovami, bude to náš server.

Po spustení servera kliknete na URL // localhost: 8888 / ws / country? wsdl nám poskytuje súbor s popisom webovej služby. WSDL slúži ako sprievodca pri porozumení ponuky služby a generovaní implementačného kódu pre klienta.

2.2. Jazyk popisu webových služieb

Pozrime sa na WSDL našej webovej služby, krajina:

V skratke sú to užitočné informácie, ktoré poskytuje:

  • môžeme vyvolať metódu findByName s povrázok argument
  • v odpovedi nám služba vráti vlastný typ služby krajina
  • typy sú definované v xsd schéma vygenerovaná v danom umiestnení // localhost: 8888 / ws / country? xsd = 1:

To je všetko, čo potrebujeme na implementáciu klienta.

Pozrime sa, ako na to v ďalšej časti.

3. Používanie wsimport vygenerovať kód klienta

3.1. Maven Plugin

Najprv si do nášho pridáme doplnok pom.xml používať tento nástroj cez Maven:

 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 

Po druhé, vykonajme tento plugin:

mvn clean jaxws: wsimport

To je všetko! Vyššie uvedený príkaz vygeneruje kód v uvedenom balíku com.baeldung.soap.ws.client.generated vnútri sourceDestDir poskytli sme v konfigurácii pluginu.

Ďalším spôsobom, ako dosiahnuť to isté, by bolo použitie wsimport užitočnosť. Vychádza z krabice so štandardnou distribúciou JDK 8 a nájdete ju pod JAVA_HOME / bin adresár.

Na vygenerovanie kódu klienta pomocou wsimport, môžeme prejsť na koreň projektu a spustiť tento príkaz:

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

Je dôležité mať na pamäti, že koncový bod služby by mal byť k dispozícii na úspešné vykonanie doplnku alebo príkazu.

Ďalej sa pozrime na vygenerované artefakty.

3.2. Generované POJO

Založený na xsd ako sme videli skôr, nástroj vygeneruje súbor s názvom Country.java:

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "krajina", propOrder = {"kapitál", "mena", "meno", "populácia"}) verejná trieda Krajina {chránený reťazcový kapitál; @XmlSchemaType (name = "string") chránená mena meny; chránený názov reťazca; chránená populácia; // štandardné getre a setre}

Ako vidíme, generovanú triedu zdobia anotácie JAXB na zaradenie a zrušenie zaradenia objektu do a z XML.

Tiež generuje a Mena enum:

@XmlType (name = "mena") @XmlEnum verejné enum Mena {EUR, INR, USD; public String value () {return name (); } public static Currency fromValue (String v) {return valueOf (v); }}

3.3. CountryService

Druhým vygenerovaným artefaktom je rozhranie, ktoré slúži ako proxy server pre skutočnú webovú službu.

Rozhranie CountryService deklaruje rovnakú metódu ako náš server, findByName:

@WebService (name = "CountryService", targetNamespace = "//server.ws.soap.baeldung.com/") @SOAPBinding (style = SOAPBinding.Style.RPC) @XmlSeeAlso ({ObjectFactory.class}) verejné rozhranie CountryService { @WebMethod @WebResult (partName = "návrat") @Action (input = "//server.ws.soap.baeldung.com/CountryService/findByNameRequest", výstup = "//server.ws.soap.baeldung.com/CountryService / findByNameResponse ") public Krajina findByName (@WebParam (name =" arg0 ", partName =" arg0 ") Reťazec arg0); }

Rozhranie je predovšetkým označené ako javax.jws.WebService, s SOAPBinding.Style ako RPC definované WSDL služby.

Metóda findByName je anotovaný s vyhlásením, že ide o a javax.jws.WebMethods očakávanými typmi vstupných a výstupných parametrov.

3.4. CountryServiceImplService

Naša ďalšia generovaná trieda, CountryServiceImplService, rozširuje sa javax.xml.ws.Služba. Jeho anotácia WebServiceClient označuje, že ide o pohľad klienta na službu:

@WebServiceClient (name = "CountryServiceImplService", targetNamespace = "//server.ws.soap.baeldung.com/", wsdlLocation = "// localhost: 8888 / ws / country? Wsdl") verejná trieda CountryServiceImplService rozširuje službu {súkromné ​​finále statická URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; súkromná konečná statická WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; private final static QName COUNTRYSERVICEIMPLSERVICE_QNAME = new QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplService"); statický {URL url = null; WebServiceException e = null; try {url = new URL ("// localhost: 8888 / ws / country? wsdl"); } catch (MalformedURLException ex) {e = new WebServiceException (ex); } COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; } public CountryServiceImplService () {super (__ getWsdlLocation (), COUNTRYSERVICEIMPLSERVICE_QNAME); } // ďalší konštruktori @WebEndpoint (name = "CountryServiceImplPort") public CountryService getCountryServiceImplPort () {return super.getPort (new QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService. trieda); } súkromná statická adresa URL __getWsdlLocation () {if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION! = null) {hod COUNTRYSERVICEIMPLSERVICE_EXCEPTION; } vrátiť COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; }}

Dôležitá metóda, ktorú si tu treba uvedomiť, je getCountryServiceImplPort. Uvedený kvalifikovaný názov koncového bodu služby, príp QNamea názov rozhrania koncového bodu služby dynamického proxy vracia inštanciu proxy.

Ako uvidíme čoskoro, na vyvolanie webovej služby musíme použiť tento server proxy.

Vďaka použitiu proxy servera sa zdá, akoby sme volali službu lokálne, a tak odstránili zložitosti vzdialeného vyvolania.

4. Testovanie klienta

Ďalej napíšeme test JUnit na pripojenie k webovej službe pomocou vygenerovaného kódu klienta.

Skôr ako to dokážeme, musíme získať inštanciu proxy služby na konci klienta:

@BeforeClass verejné nastavenie statickej neplatnosti () {služba CountryServiceImplService = nová CountryServiceImplService (); CountryService countryService = service.getCountryServiceImplPort (); }

Pre pokročilejšie scenáre, ako je napríklad zapnutie alebo vypnutie a WebServiceFeature, môžeme použiť ďalšie generované konštruktory pre CountryServiceImplService.

Teraz sa pozrime na niektoré testy:

@Test public void givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi () {assertEquals ("Nové Dillí", countryService.findByName ("India"). GetCapital ()); } @Test public void givenCountryService_whenCountryFrance_thenPopulationCorrect () {assertEquals (66710000, countryService.findByName ("Francúzsko"). GetPopulation ()); } @Test public void givenCountryService_whenCountryUSA_thenCurrencyUSD () {assertEquals (Currency.USD, countryService.findByName ("USA"). GetCurrency ()); } 

Ako vidíme, vyvolanie metód vzdialenej služby bolo rovnako jednoduché ako lokálne volanie metód. Splnomocnenec findByName metóda vrátila a Krajina inštancia zodpovedajúca názov poskytli sme. Potom sme na potvrdenie očakávaných hodnôt použili rôzne getre POJO.

5. Záver

V tomto tutoriáli sme videli, ako vyvolať webovú službu SOAP v Jave pomocou JAX-WS RI a wsimport užitočnosť.

Prípadne môžeme na to isté použiť ďalšie implementácie JAX-WS, ako napríklad Apache CXF, Apache Axis2 a Spring.

Ako vždy, zdrojový kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found