Påkalle en SOAP-nettjeneste om våren
1. Oversikt
Tidligere så vi hvordan vi skulle lage en SOAP-nettjeneste med Spring.
I denne opplæringen lærer vi hvordan du oppretter en vårbasert klient for å konsumere denne nettjenesten.
Ved å påkalle en SOAP-nettjeneste i Java, gjorde vi det samme ved hjelp av JAX-WS RI.
2. Vårens SOAP-nettjeneste - et raskt sammendrag
Tidligere hadde vi opprettet en nettjeneste om våren for å hente dataene til et land, gitt navnet. Før vi går inn i klientimplementeringen, la oss gjøre et raskt sammendrag av hvordan vi hadde gjort det.
Etter kontrakt-første tilnærmingen skrev vi først en XML-skjemafil som definerer domenet. Vi brukte deretter denne XSD til å generere klasser for forespørsel, svar og datamodell ved hjelp av jaxb2-maven-plugin.
Etter det kodet vi fire klasser:
- CountryEndpoint - sluttpunktet som svarer på forespørselen
- CountryRepository - depotet på baksiden for å levere landsdata
- WebServiceConfig - konfigurasjonen som definerer de nødvendige bønnene
- applikasjon - Spring Boot App for å gjøre tjenesten vår tilgjengelig for forbruk
Til slutt testet vi det via cURL ved å sende en SOAP-forespørsel.
La oss nå starte serveren ved å kjøre ovennevnte Boot-app og gå videre til neste trinn.
3. Kunden
Her skal vi bygge en vårklient for å påkalle og teste ovennevnte nettjeneste.
La oss nå se trinnvis hva vi trenger å gjøre for å opprette en klient.
3.1. Generer klientkode
Først genererer vi noen få klasser ved hjelp av WSDL tilgjengelig på //localhost:8080/ws/countries.wsdl. Vi laster ned og lagrer dette i vår src / main / resources mappe.
For å generere kode ved hjelp av Maven, vi legger til maven-jaxb2-plugin til vår 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 land.wsdl
Spesielt i plugin-konfigurasjonen definerte vi:
- generere katalog - mappen der de genererte gjenstandene lagres
- genererePakke - pakkenavnet som gjenstandene vil bruke
- schemaDirectory og schemaInkluderer - katalogen og filnavnet for WSDL
For å utføre JAXB-generasjonsprosessen, vil vi utføre dette pluginet ved å bygge prosjektet:
mvn kompilere
Interessant, gjenstandene som genereres her er de samme som de som genereres for tjenesten.
La oss liste opp de vi skal bruke:
- Country.java og Valuta.java - POJOer som representerer datamodellen
- GetCountryRequest.java - forespørselstypen
- GetCountryResponse.java - svarstypen
Tjenesten kan distribueres hvor som helst i verden, og med bare WSDL, klarte vi å generere de samme klassene i klientenden som serveren!
3.2. CountryClient
Deretter må vi utvide vårens WebServiceGatewaySupport å samhandle med nettjenesten.
Vi vil kalle denne klassen CountryClient:
offentlig klasse CountryClient utvider WebServiceGatewaySupport {public GetCountryResponse getCountry (String country) {GetCountryRequest request = new GetCountryRequest (); request.setName (land); GetCountryResponse respons = (GetCountryResponse) getWebServiceTemplate () .marshalSendAndReceive (forespørsel); returrespons; }}
Her definerte vi en enkelt metode getCountry, tilsvarende den operasjonen som nettjenesten hadde eksponert. I metoden opprettet vi en GetCountryRequest forekomst og påkalte nettjenesten for å få en GetCountryResponse. Med andre ord, her utførte vi SOAP-utvekslingen.
Som vi kan se, gjorde Spring påkallelsen ganske grei med sin WebServiceTemplate. Vi brukte malens metode marshalSendAndReceive å utføre SOAP-utveksling.
XML-konverteringene håndteres her via en plug-in Marshaller.
La oss nå se på konfigurasjonen der dette Marshaller kommer fra.
3.3. CountryClientConfig
Alt vi trenger for å konfigurere vår WS-klient er to bønner.
Først, a Jaxb2Marshaller for å konvertere meldinger til og fra XML, og for det andre vår CountryClient, som vil koble inn marshaller bønne:
@Configuration public class CountryClientConfig {@Bean public Jaxb2Marshaller marshaller () {Jaxb2Marshaller marshaller = new Jaxb2Marshaller (); marshaller.setContextPath ("com.baeldung.springsoap.client.gen"); retur marshaller; } @Bean public CountryClient countryClient (Jaxb2Marshaller marshaller) {CountryClient client = new CountryClient (); client.setDefaultUri ("// localhost: 8080 / ws"); client.setMarshaller (marshaller); client.setUnmarshaller (marshaller); retur klient; }}
Her må vi passe på at marshaller’S kontekstbane er den samme som genererePakke spesifisert i plugin-konfigurasjonen til vår pom.xml.
Vær også oppmerksom på standard URI for klienten her. Det er satt som såpe: adresse stedet spesifisert i WSDL.
4. Testing av klienten
Deretter skriver vi en JUnit-test for å bekrefte at klienten vår fungerer som forventet:
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) public class ClientLiveTest {@Autowired CountryClient client; @Test offentlig ugyldig givenCountryService_whenCountryPoland_thenCapitalIsWarsaw () {GetCountryResponse respons = client.getCountry ("Polen"); assertEquals ("Warszawa", respons.getCountry (). getCapital ()); } @Test offentlig ugyldig givenCountryService_whenCountrySpain_thenCurrencyEUR () {GetCountryResponse respons = client.getCountry ("Spania"); assertEquals (Currency.EUR, response.getCountry (). getCurrency ()); }}
Som vi kan se, koblet vi oss til CountryClient bønne definert i vår CountryClientConfig. Så brukte vi den getCountry å påkalle fjerntjenesten som beskrevet tidligere.
Videre var vi i stand til å hente ut informasjonen vi trengte for våre påstander ved hjelp av den genererte datamodellen POJOs, Land, og Valuta.
5. Konklusjon
I denne veiledningen, vi så det grunnleggende om hvordan man kan påberope en SOAP-nettjeneste ved hjelp av Spring WS.
Vi skrapte bare overflaten av det Spring har å tilby i SOAPs webtjenesteområde; det er mye å utforske.
Som alltid er kildekoden tilgjengelig på GitHub.