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.