Het aanroepen van een SOAP-webservice in het voorjaar

1. Overzicht

Eerder hebben we gezien hoe we een SOAP-webservice kunnen maken met Spring.

In deze zelfstudie leren we hoe u een op Spring gebaseerde client kunt maken om deze webservice te gebruiken.

Bij het aanroepen van een SOAP-webservice in Java hebben we hetzelfde gedaan met JAX-WS RI.

2. De Spring SOAP-webservice - een korte samenvatting

Eerder hadden we in het voorjaar een webservice gemaakt om de gegevens van een land op te halen, gezien de naam ervan. Laten we, voordat we ingaan op de implementatie van de klant, een korte samenvatting geven van hoe we dat hebben gedaan.

Volgens de contract-first-benadering hebben we eerst een XML-schemabestand geschreven waarin het domein werd gedefinieerd. Vervolgens hebben we deze XSD gebruikt om klassen te genereren voor het verzoek-, antwoord- en gegevensmodel met behulp van de jaxb2-maven-plugin.

Daarna hebben we vier klassen gecodeerd:

  • LandEindpunt - het eindpunt dat op het verzoek reageert
  • CountryRepository - de repository aan de achterkant om landgegevens te leveren
  • WebServiceConfig - de configuratie die de vereiste bonen definieert
  • Toepassing - de Spring Boot App om onze dienst beschikbaar te maken voor consumptie

Ten slotte hebben we het getest via cURL door een SOAP-verzoek te verzenden.

Laten we nu de server starten door de bovenstaande Boot-app uit te voeren en doorgaan naar de volgende stap.

3. De klant

Hier gaan we bouw een Spring-client om de bovenstaande webservice aan te roepen en te testen.

Laten we nu stap voor stap bekijken wat we allemaal moeten doen om een ‚Äč‚Äčklant te maken.

3.1. Genereer klantcode

Eerst zullen we een paar klassen genereren met behulp van de WSDL die beschikbaar is op //localhost:8080/ws/countries.wsdl. We zullen dit downloaden en opslaan in ons src / main / resources map.

Om code te genereren met Maven, we zullen de maven-jaxb2-plugin naar onze pom.xml:

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

Met name in de configuratie van de plug-in hebben we het volgende gedefinieerd:

  • GenereerDirectory - de map waarin de gegenereerde artefacten worden opgeslagen
  • GenereerPakket - de pakketnaam die de artefacten zullen gebruiken
  • schemaDirectory en schema Omvat - de directory en bestandsnaam voor de WSDL

Om het JAXB-generatieproces uit te voeren, zullen we deze plug-in uitvoeren door simpelweg het project te bouwen:

mvn compileren

Interessant is dat de artefacten die hier worden gegenereerd, zijn dezelfde als die voor de service.

Laten we een lijst maken van degene die we zullen gebruiken:

  • Land.java en Currency.java - POJO's die het datamodel vertegenwoordigen
  • GetCountryRequest.java - het verzoektype
  • GetCountryResponse.java - het antwoordtype

De service kan overal ter wereld worden geïmplementeerd, en met alleen de WSDL konden we dezelfde klassen aan de clientzijde genereren als op de server!

3.2. CountryClient

Vervolgens moeten we de lente verlengen WebServiceGatewaySupport om te communiceren met de webservice.

We zullen deze klas bellen CountryClient:

openbare klasse CountryClient breidt WebServiceGatewaySupport uit {openbaar GetCountryResponse getCountry (String-land) {GetCountryRequest-verzoek = nieuw GetCountryRequest (); request.setName (land); GetCountryResponse antwoord = (GetCountryResponse) getWebServiceTemplate () .marshalSendAndReceive (verzoek); antwoord teruggeven; }}

Hier hebben we een enkele methode gedefinieerd getCountry, overeenkomend met de bewerking die de webservice had weergegeven. In de methode hebben we een GetCountryRequest instantie en riep de webservice op om een GetCountryResponse. Met andere woorden, hier hebben we de SOAP-uitwisseling uitgevoerd.

Zoals we kunnen zien, maakte Spring de aanroep vrij eenvoudig met zijn WebServiceTemplate. We hebben de methode van de sjabloon gebruikt marshalSendAndReceive om de SOAP-uitwisseling uit te voeren.

De XML-conversies worden hier afgehandeld via een plug-in Marshaller.

Laten we nu eens kijken naar de configuratie waar dit Marshaller komt uit.

3.3. CountryClientConfig

Alles wat we nodig hebben om onze Spring WS-client te configureren, zijn twee bonen.

Eerst een Jaxb2Marshaller om berichten van en naar XML te converteren, en ten tweede onze CountryClient, die zal bedraden in de maarschalk Boon:

@Configuration openbare klasse CountryClientConfig {@Bean openbare Jaxb2Marshaller marshaller () {Jaxb2Marshaller marshaller = nieuwe Jaxb2Marshaller (); marshaller.setContextPath ("com.baeldung.springsoap.client.gen"); terugkeer marshaller; } @Bean openbare CountryClient countryClient (Jaxb2Marshaller marshaller) {CountryClient client = nieuwe CountryClient (); client.setDefaultUri ("// localhost: 8080 / ws"); client.setMarshaller (marshaller); client.setUnmarshaller (marshaller); klant teruggeven; }} 

Hier moeten we ervoor zorgen dat de maarschalkHet contextpad is hetzelfde als GenereerPakket gespecificeerd in de plugin-configuratie van onze pom.xml.

Let hier ook op de standaard URI voor de client. Het is ingesteld als de zeep: adres locatie opgegeven in de WSDL.

4. Testen van de klant

Vervolgens zullen we een JUnit-test schrijven om te verifiëren dat onze client naar verwachting functioneert:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (klassen = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) openbare klasse ClientLiveTest {@Autowired CountryClient-client; @Test openbare leegte gegevenCountryService_whenCountryPoland_thenCapitalIsWarsaw () {GetCountryResponse antwoord = client.getCountry ("Polen"); assertEquals ("Warschau", response.getCountry (). getCapital ()); } @Test openbare leegte gegevenCountryService_whenCountrySpain_thenCurrencyEUR () {GetCountryResponse antwoord = client.getCountry ("Spanje"); assertEquals (Currency.EUR, response.getCountry (). getCurrency ()); }} 

Zoals we kunnen zien, hebben we bedraad in de CountryClient boon gedefinieerd in onze CountryClientConfig. Vervolgens gebruikten we zijn getCountry om de service op afstand aan te roepen zoals eerder beschreven.

Bovendien waren we in staat om de informatie die we nodig hadden voor onze beweringen te extraheren met behulp van het gegenereerde datamodel POJO's, Land, en Valuta.

5. Conclusie

In deze tutorial we zagen de basis van het aanroepen van een SOAP-webservice met Spring WS.

We hebben slechts de oppervlakte bekrast van wat Spring te bieden heeft op het gebied van SOAP-webservices; er is veel te ontdekken.

Zoals altijd is de broncode beschikbaar op GitHub.