SOAP webszolgáltatás meghívása Java-ban

1. Áttekintés

Ebben az oktatóanyagban megtanuljuk, hogyan készítsünk SOAP-klienst Java-ban a JAX-WS RI segítségével. Először a kliens kódját állítjuk elő a wsimport segédprogramot, majd tesztelje egy JUnit segítségével.

A kezdők számára a JAX-WS bevezetésünk remek hátteret nyújt a témában.

2. A webszolgáltatás

Mielőtt elkezdenénk kliens építeni, szükségünk van egy szerverre. Ebben az esetben egy JAX-WS webszolgáltatást kitevő kiszolgáló.

A bemutató céljára egy webszolgáltatást fogunk használni, amely beolvassa az ország adatait, megadva annak nevét.

2.1. A megvalósítás összefoglalása

Mivel az ügyfél felépítésére összpontosítunk, nem térünk ki a szolgáltatásunk megvalósításának részleteire.

Elég, ha azt mondjuk, hogy egy felület CountryService arra használják, hogy a webszolgáltatást kitegye a külvilág elé. A dolgok egyszerűsége érdekében a webes szolgáltatást a javax.xml.ws.Endpoint API az osztályunkban CountryServicePublisher.

Futni fogunk CountryServicePublisher Java alkalmazásként olyan végpont közzétételére, amely elfogadja a beérkező kéréseket. Más szóval, ez lesz a szerverünk.

A szerver elindítása után nyomja meg az URL-t // localhost: 8888 / ws / country? wsdl megadja nekünk a webszolgáltatás leírási fájlt. A WSDL útmutatóként szolgál a szolgáltatás kínálatának megértéséhez és implementációs kód generálásához az ügyfél számára.

2.2. A webszolgáltatások leírási nyelve

Nézzük meg webszolgáltatásunk WSDL-jét, ország:

Dióhéjban ez a hasznos információ:

  • meghívhatjuk a módszert findByName val,-vel húr érv
  • válaszul a szolgáltatás egyedi típusú típust küld vissza nekünk ország
  • típusokat egy xsd a helyszínen létrehozott séma // localhost: 8888 / ws / country? xsd = 1:

Ennyit kell vennünk egy ügyfél megvalósításához.

A következő szakaszban nézzük meg, hogyan.

3. Használata wsimport kliens kód generálásához

3.1. Maven plugin

Először adjunk hozzá egy bővítményt a mi oldalunkhoz pom.xml ennek az eszköznek a Mavenen keresztül történő használatához:

 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 

Másodszor hajtsuk végre ezt a bővítményt:

mvn tiszta jaxws: wsimport

Ez minden! A fenti parancs kódot generál a megadott csomagban com.baeldung.soap.ws.client.generated benne sourceDestDir a plugin konfigurációban biztosítottuk.

Egy másik módszer ennek elérésére a wsimport hasznosság. A dobozból a JDK 8 szabványos disztribúcióval kerül elő, és itt található JAVA_HOME / bin Könyvtár.

Ügyfélkód előállításához a wsimport, eljuthatunk a projekt gyökeréhez, és futtathatjuk ezt a parancsot:

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

Fontos szem előtt tartani, hogy a bővítmény vagy a parancs sikeres végrehajtásához a szolgáltatás végpontjának elérhetőnek kell lennie.

Ezután nézzük meg a létrehozott tárgyakat.

3.2. Generált POJO-k

Alapján xsd korábban láttuk, az eszköz létrehoz egy nevű fájlt Ország.java:

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (név = "ország", propOrder = {"főváros", "valuta", "név", "népesség"}) nyilvános osztály Ország {védett Karakterlánc; @XmlSchemaType (name = "string") védett Pénznem; védett karakterlánc neve; védett int lakosság; // szabványos mérőeszközök és beállítók}

Mint láthatjuk, a létrehozott osztályt JAXB kommentárok díszítik az objektum XML-be és onnan történő rendezésére és feloldására.

Ezenkívül generál a Valuta enum:

@XmlType (name = "currency") @XmlEnum public enum Pénznem {EUR, INR, USD; public String érték () {return name (); } public static Currency fromValue (String v) {return valueOf (v); }}

3.3. CountryService

A második generált tárgy egy olyan felület, amely a tényleges webszolgáltatás proxyjaként működik.

Az interfész CountryService ugyanazt a módszert deklarálja, mint a szerverünk, findByName:

@WebService (name = "CountryService", targetNamespace = "//server.ws.soap.baeldung.com/") @SOAPBinding (style = SOAPBinding.Style.RPC) @XmlSeeAlso ({ObjectFactory.class}) nyilvános felület CountryService { @WebMethod @WebResult (partName = "return") @Action (input = "//server.ws.soap.baeldung.com/CountryService/findByNameRequest", output = "//server.ws.soap.baeldung.com/CountryService / findByNameResponse ") public Ország findByName (@WebParam (név =" arg0 ", partName =" arg0 ") karakterlánc arg0); }

Nevezetesen az interfész a-ként van megjelölve javax.jws.WebService, val,-vel SOAPKötés. Stílus mint a szolgáltatás WSDL-jének meghatározása szerinti RPC.

A módszer, a metódus findByName megjegyzéssel deklarálja, hogy ez a javax.jws.WebMethod, a várható bemeneti és kimeneti paramétertípusokkal.

3.4. CountryServiceImplService

A következő generált osztályunk, CountryServiceImplService, kiterjeszti javax.xml.ws.Service. Annotációja WebServiceClient azt jelzi, hogy a szolgáltatás ügyfélnézete:

@WebServiceClient (name = "CountryServiceImplService", targetNamespace = "//server.ws.soap.baeldung.com/", wsdlLocation = "// localhost: 8888 / ws / country? Wsdl") public class CountryServiceImplService meghosszabbítja a szolgáltatást statikus URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; privát végleges statikus WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; privát végleges statikus QName COUNTRYSERVICEIMPLSERVICE_QNAME = új QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplService"); statikus {URL url = null; WebServiceException e = null; próbáld ki az {url = új URL-t ("// localhost: 8888 / ws / country? wsdl"); } catch (MalformedURLException ex) {e = új WebServiceException (ex); } COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; } public CountryServiceImplService () {super (__ getWsdlLocation (), COUNTRYSERVICEIMPLSERVICE_QNAME); } // egyéb konstruktorok @WebEndpoint (name = "CountryServiceImplPort") public CountryService getCountryServiceImplPort () {return super.getPort (new QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService. osztály); } privát statikus URL __getWsdlLocation () {if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION! = null) {dob COUNTRYSERVICEIMPLSERVICE_EXCEPTION; } return COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; }}

Az itt megjegyzendő fontos módszer az getCountryServiceImplPort. Megadta a szolgáltatás végpont minősített nevét, vagy QName, és a dinamikus proxy szolgáltatás végpontjának interfészneve, proxy példányt ad vissza.

A webszolgáltatás meghívásához ezt a proxyt kell használnunk, amint hamarosan láthatjuk.

A proxy használata úgy tűnik, mintha egy szolgáltatást helyben hívnánk, elvonva a távoli meghívás bonyodalmait.

4. Az ügyfél tesztelése

Ezután írunk egy JUnit tesztet, hogy csatlakozzunk a webszolgáltatáshoz a létrehozott ügyfélkód segítségével.

Mielőtt ezt megtehetnénk, meg kell szereznünk a szolgáltatás proxy példányát az ügyfél végén:

@BeforeClass public static void setup () {CountryServiceImplService service = new CountryServiceImplService (); CountryService countryService = service.getCountryServiceImplPort (); }

Haladóbb forgatókönyvek esetén, például a WebServiceFeature, használhatunk más generált konstruktorokat is CountryServiceImplService.

Most nézzünk meg néhány tesztet:

@Test public void givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi () {assertEquals ("Új-Delhi", countryService.findByName ("India". GetCapital ()); } @Test public void givenCountryService_whenCountryFrance_thenPopulationCorrect () {assertEquals (66710000, countryService.findByName ("Franciaország"). GetPopulation ()); } @Test public void givenCountryService_whenCountryUSA_thenCurrencyUSD () {assertEquals (Currency.USD, countryService.findByName ("USA"). GetCurrency ()); } 

Mint láthatjuk, a távoli szolgáltatás metódusainak meghívása olyan egyszerűvé vált, mint a metódusok helyi hívása. A meghatalmazotté findByName metódus adta vissza a Ország a név biztosítottuk. Ezután a POJO különféle gettereit használtuk a várható értékek érvényesítésére.

5. Következtetés

Ebben az oktatóanyagban azt láthattuk, hogyan hívhatunk elő SOAP webszolgáltatást a Java-ban a JAX-WS RI és a wsimport hasznosság.

Alternatív megoldásként használhatunk más JAX-WS megvalósításokat is, mint például az Apache CXF, az Apache Axis2 és a Spring.

Mint mindig, a forráskód is elérhető a GitHubon.