Påkald af en SOAP-webservice i Java

1. Oversigt

I denne vejledning vi lærer, hvordan man bygger en SOAP-klient i Java med JAX-WS RI. Først genererer vi klientkoden ved hjælp af wsimport hjælpeprogram, og test det derefter ved hjælp af en JUnit.

For dem der starter, giver vores introduktion til JAX-WS god baggrund om emnet.

2. Webtjenesten

Før vi begynder at opbygge en klient, har vi brug for en server. I dette tilfælde en server, der udsætter en JAX-WS-webservice.

Med henblik på denne vejledning bruger vi en webservice, der henter os et lands data givet sit navn.

2.1. Resumé af implementeringen

Da vi fokuserer på at opbygge klienten, kommer vi ikke ind på implementeringsoplysningerne for vores service.

Lad os nok til at sige, at en grænseflade CountryService bruges til at udsætte webservicen for den eksterne verden. For at holde tingene enkle, Vi bygger og implementerer webservicen ved hjælp af javax.xml.ws.Endpoint API i vores klasse CountryServicePublisher.

Vi løber CountryServicePublisher som et Java-program til at offentliggøre et slutpunkt, der accepterer de indgående anmodninger. Med andre ord, dette vil være vores server.

Når du har startet serveren, skal du trykke på URL'en // localhost: 8888 / ws / country? wsdl giver os beskrivelsen af ​​webservicen. WSDL fungerer som en guide til at forstå tjenestens tilbud og generere implementeringskode til klienten.

2.2. Webtjenestens beskrivelse Sprog

Lad os se på vores webservices WSDL, Land:

I en nøddeskal er dette den nyttige information, den giver:

  • vi kan påberåbe sig metoden findByName med en snor argument
  • som svar vil tjenesten returnere os til en brugerdefineret type Land
  • typer er defineret i en xsd skema genereret på stedet // localhost: 8888 / ws / country? xsd = 1:

Det er alt, hvad vi har brug for for at implementere en klient.

Lad os se hvordan i det næste afsnit.

3. Brug wsimport at generere klientkode

3.1. Maven-plugin

Lad os først tilføje et plugin til vores pom.xml at bruge dette værktøj via 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 

For det andet, lad os udføre dette plugin:

mvn ren jaxws: wsimport

Det er alt! Ovenstående kommando genererer kode i den angivne pakke com.baeldung.soap.ws.client.genereret inde i sourceDestDir vi leverede i plugin-konfigurationen.

En anden måde at opnå det samme på er at bruge wsimport hjælpeprogram. Det kommer ud af kassen med standard JDK 8-distribution og kan findes under JAVA_HOME / bin vejviser.

At generere klientkode ved hjælp af wsimport, kan vi navigere til projektets rod og køre denne kommando:

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

Det er vigtigt at huske på, at tjenesteendepunktet skal være tilgængeligt for at kunne udføre plugin eller kommando.

Lad os derefter se på de genererede artefakter.

3.2. Genererede POJO'er

Baseret på xsd som vi så tidligere, genererer værktøjet en fil med navnet Land.java:

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "country", propOrder = {"capital", "currency", "name", "population"}) offentlig klasse Land {beskyttet String capital; @XmlSchemaType (navn = "streng") beskyttet valuta valuta; beskyttet strengnavn; beskyttet int befolkning // standard getters og setter}

Som vi kan se, er den genererede klasse dekoreret med JAXB-annoteringer til at samle og fjerne markeringen af ​​objektet til og fra XML.

Det genererer også en betalingsmiddel enum:

@XmlType (navn = "valuta") @XmlEnum offentlig enum Valuta {EUR, INR, USD; offentlig strengværdi () {returnavn (); } offentlig statisk valuta fra værdi (streng v) {return valueOf (v); }}

3.3. CountryService

Den anden genererede artefakt er en grænseflade, der fungerer som en proxy til den aktuelle webservice.

Grænsefladen CountryService erklærer den samme metode som vores server, findByName:

@WebService (name = "CountryService", targetNamespace = "//server.ws.soap.baeldung.com/") @SOAPBinding (style = SOAPBinding.Style.RPC) @XmlSeeAlso ({ObjectFactory.class}) offentlig grænseflade CountryService { @WebMethod @WebResult (partName = "return") @Action (input = "//server.ws.soap.baeldung.com/CountryService/findByNameRequest", output = "//server.ws.soap.baeldung.com/CountryService / findByNameResponse ") public Country findByName (@WebParam (name =" arg0 ", partName =" arg0 ") Streng arg0); }

Især er grænsefladen markeret som en javax.jws.WebService, med en SOAPBinding.Style som RPC som defineret af tjenestens WSDL.

Metoden findByName er kommenteret for at erklære, at det er en javax.jws.WebMethod, med dets forventede input- og outputparametertyper.

3.4. CountryServiceImplService

Vores næste genererede klasse, CountryServiceImplService, strækker sig javax.xml.ws.Service. Dens kommentar WebServiceClient angiver, at det er klientopfattelsen af ​​en tjeneste:

@WebServiceClient (name = "CountryServiceImplService", targetNamespace = "//server.ws.soap.baeldung.com/", wsdlLocation = "// localhost: 8888 / ws / country? Wsdl") offentlig klasse CountryServiceImplService udvider Service {privat final statisk URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; privat endelig statisk WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; privat endelig statisk QName COUNTRYSERVICEIMPLSERVICE_QNAME = nyt QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplService"); statisk {URL url = null; WebServiceException e = null; prøv {url = ny URL ("// localhost: 8888 / ws / country? wsdl"); } fange (MalformedURLException ex) {e = ny WebServiceException (ex); } COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; } offentlig CountryServiceImplService () {super (__ getWsdlLocation (), COUNTRYSERVICEIMPLSERVICE_QNAME); } // andre konstruktører @WebEndpoint (navn = "CountryServiceImplPort") offentlig CountryService getCountryServiceImplPort () {returner super.getPort (nyt QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplPort"), CountryService. klasse); } privat statisk URL __getWsdlLocation () {if (COUNTRYSERVICEIMPLSERVICE_EXCEPTION! = null) {throw COUNTRYSERVICEIMPLSERVICE_EXCEPTION; } returner COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; }}

Den vigtige metode at bemærke her er getCountryServiceImplPort. Givet et kvalificeret navn på serviceendepunktet, eller QNameog den dynamiske proxys navne på grænseflade til serviceendepunkt, den returnerer en proxyinstans.

For at påkalde webservicen skal vi bruge denne proxy, som vi snart vil se.

Brug af en proxy får det til at virke som om vi ringer til en tjeneste lokalt, hvor vi fjerner komplikationerne ved fjernanvendelse.

4. Test af klienten

Dernæst skriver vi en JUnit-test for at oprette forbindelse til webservicen ved hjælp af den genererede klientkode.

Før vi kan gøre det, skal vi hente tjenestens proxyinstans i klientenden:

@BeforeClass offentlig statisk ugyldig opsætning () {CountryServiceImplService service = ny CountryServiceImplService (); CountryService countryService = service.getCountryServiceImplPort (); }

For mere avancerede scenarier såsom aktivering eller deaktivering af en WebServiceFeature, kan vi bruge andre genererede konstruktører til CountryServiceImplService.

Lad os nu se på nogle tests:

@Test offentlig ugyldighed givenCountryService_whenCountryIndia_thenCapitalIsNewDelhi () {assertEquals ("New Delhi", countryService.findByName ("India"). GetCapital ()); } @Test offentligt ugyldigt givenCountryService_whenCountryFrance_thenPopulationCorrect () {assertEquals (66710000, countryService.findByName ("France"). GetPopulation ()); } @Test offentlig ugyldighed givenCountryService_whenCountryUSA_thenCurrencyUSD () {assertEquals (Currency.USD, countryService.findByName ("USA"). GetCurrency ()); } 

Som vi kan se, blev påkald af fjerntjenestens metoder så simpelt som opkaldsmetoder lokalt. Proxyen er findByName metode returneres a Land forekomst, der matcher navn vi leverede. Derefter brugte vi forskellige getters af POJO til at hævde forventede værdier.

5. Konklusion

I denne vejledning så vi, hvordan man påberåber en SOAP-webtjeneste i Java ved hjælp af JAX-WS RI og wsimport hjælpeprogram.

Alternativt kan vi bruge andre JAX-WS-implementeringer som Apache CXF, Apache Axis2 og Spring til at gøre det samme.

Som altid er kildekoden tilgængelig på GitHub.


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