Påkalle en SOAP-nettjeneste i Java

1. Oversikt

I denne veiledningen, vi lærer hvordan du bygger en SOAP-klient i Java med JAX-WS RI. Først genererer vi klientkoden ved hjelp av wsimport verktøyet, og test det deretter med en JUnit.

For de som begynner, gir vår introduksjon til JAX-WS god bakgrunn om emnet.

2. Nettjenesten

Før vi begynner å bygge en klient, trenger vi en server. I dette tilfellet en server som avslører en JAX-WS-nettjeneste.

For formålet med denne opplæringen, vil vi bruke en webtjeneste som vil hente oss et lands data, gitt navnet.

2.1. Sammendrag av gjennomføring

Siden vi fokuserer på å bygge klienten, kommer vi ikke inn på implementeringsdetaljene for tjenesten vår.

La oss være nok til å si at et grensesnitt CountryService brukes til å eksponere nettjenesten for den eksterne verdenen. For å holde ting enkelt, Vi bygger og distribuerer nettjenesten ved hjelp av javax.xml.ws.Endpoint API i klassen vår CountryServicePublisher.

Vi løper CountryServicePublisher som et Java-program for å publisere et sluttpunkt som godtar innkommende forespørsler. Dette vil med andre ord være serveren vår.

Etter å ha startet serveren, trykker du på URL // localhost: 8888 / ws / country? wsdl gir oss beskrivelsen av webtjenesten. WSDL fungerer som en guide for å forstå tjenestens tilbud og generere implementeringskode for klienten.

2.2. Webtjenestens beskrivelsesspråk

La oss se på nettjenestens WSDL, land:

I et nøtteskall er dette den nyttige informasjonen den gir:

  • vi kan påkalle metoden findByName med en streng argument
  • som svar, vil tjenesten gi oss en tilpasset type land
  • typer er definert i en xsd skjema generert på stedet // localhost: 8888 / ws / country? xsd = 1:

Det er alt vi trenger for å implementere en klient.

La oss se hvordan i neste avsnitt.

3. Bruke wsimport å generere klientkode

3.1. Maven Plugin

La oss først legge til et plugin til vårt pom.xml for å bruke dette verktøyet 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 andre, la oss utføre dette pluginet:

mvn ren jaxws: wsimport

Det er alt! Ovennevnte kommando genererer kode i den angitte pakken com.baeldung.soap.ws.client.generated inne i sourceDestDir vi ga i plugin-konfigurasjonen.

En annen måte å oppnå det samme på er å bruke wsimport nytte. Den kommer ut av esken med standard JDK 8-distribusjon og kan bli funnet under JAVA_HOME / søppel katalog.

Å generere klientkode ved hjelp av wsimport, kan vi navigere til prosjektets rot, og kjøre denne kommandoen:

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

Det er viktig å huske på at tjenestens endepunkt skal være tilgjengelig for å kunne utføre plugin eller kommando.

Deretter, la oss se på de genererte gjenstandene.

3.2. Genererte POJOer

Basert på xsd vi så tidligere, vil verktøyet generere en fil med navnet Country.java:

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

Som vi kan se, er den genererte klassen dekorert med JAXB-merknader for rangering og unmarshalling av objektet til og fra XML.

Det genererer også en Valuta enum:

@XmlType (name = "currency") @XmlEnum public enum Valuta {EUR, INR, USD; offentlig strengverdi () {returnavn (); } offentlig statisk valuta fraValue (streng v) {returverdiOf (v); }}

3.3. CountryService

Den andre genererte gjenstanden er et grensesnitt som fungerer som en proxy for den faktiske nettjenesten.

Grensesnittet CountryService erklærer samme metode som serveren vår, findByName:

@WebService (name = "CountryService", targetNamespace = "//server.ws.soap.baeldung.com/") @SOAPBinding (style = SOAPBinding.Style.RPC) @XmlSeeAlso ({ObjectFactory.class}) offentlig grensesnitt 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); }

Spesielt er grensesnittet merket som en javax.jws.WebService, med en SOAPBinding.Style som RPC som definert av tjenestens WSDL.

Metoden findByName er kommentert for å erklære at det er en javax.jws.WebMethod, med forventede inngangs- og utgangsparametertyper.

3.4. CountryServiceImplService

Vår neste genererte klasse, CountryServiceImplService, strekker javax.xml.ws.Service. Kommentaren WebServiceClient angir at det er klientsynet til en tjeneste:

@WebServiceClient (name = "CountryServiceImplService", targetNamespace = "//server.ws.soap.baeldung.com/", wsdlLocation = "// localhost: 8888 / ws / country? Wsdl") offentlig klasse CountryServiceImplService utvider tjenesten {privat finale statisk URL COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION; privat endelig statisk WebServiceException COUNTRYSERVICEIMPLSERVICE_EXCEPTION; privat endelig statisk QName COUNTRYSERVICEIMPLSERVICE_QNAME = ny QName ("// server.ws.soap.baeldung.com/", "CountryServiceImplService"); statisk {URL url = null; WebServiceException e = null; prøv {url = new URL ("// localhost: 8888 / ws / country? wsdl"); } fange (MalformedURLException ex) {e = new WebServiceException (ex); } COUNTRYSERVICEIMPLSERVICE_WSDL_LOCATION = url; COUNTRYSERVICEIMPLSERVICE_EXCEPTION = e; } offentlig CountryServiceImplService () {super (__ getWsdlLocation (), COUNTRYSERVICEIMPLSERVICE_QNAME); } // andre konstruktører @WebEndpoint (name = "CountryServiceImplPort") public CountryService getCountryServiceImplPort () {return super.getPort (new 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 viktige metoden å merke seg her er getCountryServiceImplPort. Gitt et kvalifisert navn på tjenestens endepunkt, eller QName, og den dynamiske proxyens grensesnittnavn for tjenestens endepunkt, den returnerer en proxy-forekomst.

For å påkalle nettjenesten, må vi bruke denne proxyen, som vi snart vil se.

Ved å bruke en proxy får det til å virke som om vi ringer en tjeneste lokalt, og trekker bort komplikasjonene ved ekstern påkallelse.

4. Testing av klienten

Deretter skriver vi en JUnit-test for å koble til nettjenesten ved hjelp av den genererte klientkoden.

Før vi kan gjøre det, må vi få tjenestens proxy-forekomst på klientens slutt:

@BeforeClass offentlig statisk ugyldig oppsett () {CountryServiceImplService-tjeneste = ny CountryServiceImplService (); CountryService countryService = service.getCountryServiceImplPort (); }

For mer avanserte scenarier som aktivering eller deaktivering av a WebServiceFeature, kan vi bruke andre genererte konstruktører til CountryServiceImplService.

La oss nå se på noen tester:

@Test offentlig ugyldig gittCountryService_whenCountryIndia_thenCapitalIsNewDelhi () {assertEquals ("New Delhi", countryService.findByName ("India"). GetCapital ()); } @Test offentlig ugyldig givenCountryService_whenCountryFrance_thenPopulationCorrect () {assertEquals (66710000, countryService.findByName ("Frankrike"). GetPopulation ()); } @Test offentlig ugyldig givenCountryService_whenCountryUSA_thenCurrencyUSD () {assertEquals (Currency.USD, countryService.findByName ("USA"). GetCurrency ()); } 

Som vi kan se, ble det påkalle fjerntjenestens metoder så enkle som ringemetoder lokalt. Fullmakten er findByName metoden returnerte a Land forekomst som samsvarer med Navn vi ga. Deretter brukte vi forskjellige getters av POJO for å hevde forventede verdier.

5. Konklusjon

I denne opplæringen så vi hvordan vi kan påkalle en SOAP-nettjeneste i Java ved hjelp av JAX-WS RI og wsimport nytte.

Alternativt kan vi bruke andre JAX-WS-implementeringer som Apache CXF, Apache Axis2 og Spring for å gjøre det samme.

Som alltid er kildekoden tilgjengelig på GitHub.


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