Appel d'un service Web SOAP au printemps

1. Vue d'ensemble

Auparavant, nous avons vu comment créer un service Web SOAP avec Spring.

Dans ce didacticiel, nous allons apprendre à créer un client Spring pour utiliser ce service Web .

En invoquant un service Web SOAP en Java, nous avons fait de même avec JAX-WS RI.

2. Le service Web Spring SOAP - un résumé rapide

Auparavant, nous avions créé un service Web au printemps pour récupérer les données d'un pays, vu son nom. Avant de plonger dans l'implémentation du client, faisons un bref récapitulatif de la façon dont nous l'avons fait.

En suivant l'approche du contrat d'abord, nous avons d'abord écrit un fichier de schéma XML définissant le domaine. Nous avons ensuite utilisé ce XSD pour générer des classes pour la requête, la réponse et le modèle de données à l'aide du jaxb2-maven-plugin .

Après cela, nous avons codé quatre classes:

  • CountryEndpoint - le point de terminaison qui répond à la demande
  • CountryRepository - le référentiel en backend pour fournir les données nationales
  • WebServiceConfig - la configuration définissant les beans requis
  • Application - l' application Spring Boot pour rendre notre service disponible à la consommation

Enfin, nous l'avons testé via cURL en envoyant une requête SOAP.

Maintenant, démarrons le serveur en exécutant l'application de démarrage ci-dessus et passons à l'étape suivante.

3. Le client

Ici, nous allons créer un client Spring pour appeler et tester le service Web ci-dessus .

Maintenant, voyons pas à pas ce que nous devons faire pour créer un client.

3.1. Générer le code client

Tout d'abord, nous allons générer quelques classes à l'aide du WSDL disponible à l' adresse //localhost:8080/ws/countries.wsdl. Nous téléchargerons et enregistrerons ceci dans notre dossier src / main / resources .

Pour générer du code à l'aide de Maven, nous ajouterons le plugin maven-jaxb2-plugin à notre pom.xml :

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

Notamment, dans la configuration du plugin, nous avons défini:

  • generateDirectory - le dossier dans lequel les artefacts générés seront enregistrés
  • generatePackage - le nom du package que les artefacts utiliseront
  • schemaDirectory et schemaIncludes - le répertoire et le nom de fichier du WSDL

Pour effectuer le processus de génération JAXB, nous allons exécuter ce plugin en construisant simplement le projet:

mvn compile

Fait intéressant, les artefacts générés ici sont les mêmes que ceux générés pour le service.

Énumérons ceux que nous utiliserons:

  • Country.java et Currency.java - POJO représentant le modèle de données
  • GetCountryRequest.java - le type de demande
  • GetCountryResponse.java - le type de réponse

Le service peut être déployé n'importe où dans le monde, et avec juste son WSDL, nous avons pu générer les mêmes classes côté client que le serveur!

3.2. PaysClient

Ensuite, nous devons étendre WebServiceGatewaySupport de Spring pour interagir avec le service Web.

Nous appellerons cette classe CountryClient :

public class CountryClient extends WebServiceGatewaySupport { public GetCountryResponse getCountry(String country) { GetCountryRequest request = new GetCountryRequest(); request.setName(country); GetCountryResponse response = (GetCountryResponse) getWebServiceTemplate() .marshalSendAndReceive(request); return response; } }

Ici, nous avons défini une seule méthode getCountry , correspondant à l'opération que le service Web avait exposée. Dans la méthode, nous avons créé une instance GetCountryRequest et appelé le service Web pour obtenir une GetCountryResponse . En d'autres termes, voici où nous avons effectué l'échange SOAP .

Comme nous pouvons le voir, Spring a rendu l'invocation assez simple avec son WebServiceTemplate . Nous avons utilisé la méthode marshalSendAndReceive du modèle pour effectuer l'échange SOAP.

Les conversions XML sont gérées ici via un Marshaller branché .

Regardons maintenant la configuration d'où vient ce Marshaller .

3.3. CountryClientConfig

Tout ce dont nous avons besoin pour configurer notre client Spring WS, ce sont deux beans.

Tout d'abord, un Jaxb2Marshaller pour convertir des messages vers et depuis XML, et deuxièmement, notre CountryClient , qui va câbler le bean marshaller :

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

Ici, nous devons veiller à ce que le chemin de contexte du marshaller soit le même que generatePackage spécifié dans la configuration du plugin de notre pom.xml .

Veuillez également noter l'URI par défaut du client ici. Il est défini comme l' emplacement de l' adresse soap: spécifié dans le WSDL.

4. Test du client

Ensuite, nous allons écrire un test JUnit pour vérifier que notre client fonctionne comme prévu:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class) public class ClientLiveTest { @Autowired CountryClient client; @Test public void givenCountryService_whenCountryPoland_thenCapitalIsWarsaw() { GetCountryResponse response = client.getCountry("Poland"); assertEquals("Warsaw", response.getCountry().getCapital()); } @Test public void givenCountryService_whenCountrySpain_thenCurrencyEUR() { GetCountryResponse response = client.getCountry("Spain"); assertEquals(Currency.EUR, response.getCountry().getCurrency()); } } 

Comme nous pouvons le voir, nous avons câblé dans le bean CountryClient défini dans notre CountryClientConfig . Ensuite, nous avons utilisé son getCountry pour appeler le service distant comme décrit précédemment.

De plus, nous avons pu extraire les informations dont nous avions besoin pour nos affirmations en utilisant le modèle de données généré POJOs, Country et Currency .

5. Conclusion

Dans ce didacticiel, nous avons vu les bases de l'appel d'un service Web SOAP à l'aide de Spring WS .

Nous n'avons fait qu'effleurer la surface de ce que Spring a à offrir dans le domaine des services Web SOAP; il y a beaucoup à explorer.

Comme toujours, le code source est disponible sur sur GitHub.