Påberåber sig en SOAP-webservice om foråret

1. Oversigt

Tidligere så vi, hvordan vi opretter en SOAP-webservice med Spring.

I denne vejledning lærer vi, hvordan man opretter en forårsbaseret klient, der bruger denne webservice.

Ved at påkalde en SOAP-webtjeneste i Java gjorde vi det samme ved hjælp af JAX-WS RI.

2. Spring SOAP Web Service - en hurtig opsummering

Tidligere havde vi oprettet en webtjeneste i foråret for at hente et lands data, givet dets navn. Før vi går ind i klientimplementeringen, lad os lave en hurtig sammenfatning af, hvordan vi havde gjort det.

Efter kontrakt-første tilgang skrev vi først en XML-skemafil, der definerede domænet. Vi brugte derefter denne XSD til at generere klasser til anmodningen, svaret og datamodellen ved hjælp af jaxb2-maven-plugin.

Derefter kodede vi fire klasser:

  • CountryEndpoint - slutpunktet, der svarer på anmodningen
  • CountryRepository - arkivet i backend til levering af landedata
  • WebServiceConfig - konfigurationen, der definerer de krævede bønner
  • Ansøgning - Spring Boot App for at gøre vores service tilgængelig til forbrug

Endelig testede vi det via cURL ved at sende en SOAP-anmodning.

Lad os nu starte serveren ved at køre ovenstående Boot-app og gå videre til næste trin.

3. Kunden

Her skal vi opbygge en Spring-klient til at påkalde og teste ovenstående webservice.

Lad os nu se trin for trin hvad vi skal gøre for at oprette en klient.

3.1. Generer klientkode

Først genererer vi et par klasser ved hjælp af WSDL tilgængelig på //localhost:8080/ws/countries.wsdl. Vi downloader og gemmer dette i vores src / main / ressourcer folder.

For at generere kode ved hjælp af Maven, vi tilføjer maven-jaxb2-plugin til vores pom.xml:

 org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.14.0 genererer WSDL $ {project.basedir} / src / main / java com.baeldung.springsoap.client.gen $ {project.basedir} / src / main / resources lande.wsdl 

Især i konfigurationen af ​​plugin definerede vi:

  • generereDirectory - mappen, hvor de genererede artefakter gemmes
  • genererePakke - pakkenavnet, som artefakterne vil bruge
  • schemaDirectory og schemaIncludes - mappen og filnavnet til WSDL

For at udføre JAXB-genereringsprocessen udfører vi dette plugin ved blot at opbygge projektet:

mvn kompilere

Interessant nok de artefakter, der genereres her, er de samme som dem, der genereres til tjenesten.

Lad os liste ned dem, vi vil bruge:

  • Land.java og Valuta.java - POJO'er, der repræsenterer datamodellen
  • GetCountryRequest.java - anmodningstypen
  • GetCountryResponse.java - svarstypen

Tjenesten kan blive implementeret hvor som helst i verden, og med kun dens WSDL var vi i stand til at generere de samme klasser i klientenden som serveren!

3.2. CountryClient

Dernæst er vi nødt til at udvide forårets WebServiceGatewaySupport at interagere med webservicen.

Vi kalder denne klasse CountryClient:

offentlig klasse CountryClient udvider WebServiceGatewaySupport {public GetCountryResponse getCountry (String country) {GetCountryRequest request = new GetCountryRequest (); request.setName (land); GetCountryResponse respons = (GetCountryResponse) getWebServiceTemplate () .marshalSendAndReceive (anmodning); tilbagevenden svar }}

Her definerede vi en enkelt metode getCountrysvarende til den operation, som webservicen havde udsat for. I metoden oprettede vi en GetCountryRequest instans og påkaldte webtjenesten for at få en GetCountryResponse. Med andre ord, her udførte vi SOAP-udvekslingen.

Som vi kan se, gjorde Spring indkaldelsen ret ligetil med sin WebServiceTemplate. Vi brugte skabelonens metode marshalSendAndReceive at udføre SOAP-udveksling.

XML-konverteringerne håndteres her via en plug-in Marshaller.

Lad os nu se på konfigurationen, hvor dette Marshaller kommer fra.

3.3. CountryClientConfig

Alt hvad vi behøver for at konfigurere vores Spring WS-klient er to bønner.

Først en Jaxb2Marshaller at konvertere meddelelser til og fra XML, og for det andet vores CountryClient, som vil tilslutte marshaller bønne:

@Configuration public class CountryClientConfig {@Bean public Jaxb2Marshaller marshaller () {Jaxb2Marshaller marshaller = new Jaxb2Marshaller (); marshaller.setContextPath ("com.baeldung.springsoap.client.gen"); returnere marshaller; } @Bean public CountryClient countryClient (Jaxb2Marshaller marshaller) {CountryClient client = new CountryClient (); client.setDefaultUri ("// localhost: 8080 / ws"); client.setMarshaller (marshaller); client.setUnmarshaller (marshaller); tilbagevendende klient; }} 

Her skal vi passe på, at marshaller'S kontekststi er den samme som genererePakke specificeret i vores plugin-konfiguration pom.xml.

Bemærk også standard-URI for klienten her. Det er indstillet som sæbe: adresse placering specificeret i WSDL.

4. Test af klienten

Dernæst skriver vi en JUnit-test for at bekræfte, at vores klient fungerer som forventet:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (klasser = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) offentlig klasse ClientLiveTest {@Autowired CountryClient-klient; @Test offentlig ugyldighed givenCountryService_whenCountryPoland_thenCapitalIsWarsaw () {GetCountryResponse respons = client.getCountry ("Polen"); assertEquals ("Warszawa", respons.getCountry (). getCapital ()); } @ Test offentligt ugyldigt givenCountryService_whenCountrySpain_thenCurrencyEUR () {GetCountryResponse respons = client.getCountry ("Spanien"); assertEquals (Currency.EUR, response.getCountry (). getCurrency ()); }} 

Som vi kan se, kablet vi i CountryClient bønne defineret i vores CountryClientConfig. Derefter brugte vi dens getCountry at påkalde fjerntjenesten som beskrevet tidligere.

Desuden var vi i stand til at udtrække de oplysninger, vi havde brug for til vores påstande ved hjælp af den genererede datamodel POJO'er, Land, og betalingsmiddel.

5. Konklusion

I denne vejledning vi så det grundlæggende i, hvordan man påberåber sig en SOAP-webtjeneste ved hjælp af Spring WS.

Vi skrabet blot overfladen af, hvad Spring har at tilbyde i SOAP-webtjenesteområdet; der er masser at udforske.

Som altid er kildekoden tilgængelig på GitHub.