Invocare un servizio Web SOAP in primavera

1. Panoramica

In precedenza, abbiamo visto come creare un servizio web SOAP con Spring.

In questo tutorial impareremo come creare un client basato su Spring per utilizzare questo servizio web .

Invocando un servizio web SOAP in Java, abbiamo fatto lo stesso utilizzando JAX-WS RI.

2. Il servizio Web Spring SOAP: riepilogo rapido

In precedenza, avevamo creato un servizio web in primavera per recuperare i dati di un paese, dato il suo nome. Prima di approfondire l'implementazione del client, facciamo un breve riepilogo di come l'abbiamo fatto.

Seguendo l'approccio basato sul contratto, abbiamo prima scritto un file di schema XML che definisce il dominio. Abbiamo quindi utilizzato questo XSD per generare classi per la richiesta, la risposta e il modello di dati utilizzando il plug-in jaxb2-maven .

Successivamente abbiamo codificato quattro classi:

  • CountryEndpoint : l'endpoint che risponde alla richiesta
  • CountryRepository : il repository nel back-end per fornire i dati del paese
  • WebServiceConfig : la configurazione che definisce i bean richiesti
  • Applicazione : l'app Spring Boot per rendere il nostro servizio disponibile per il consumo

Infine, l'abbiamo testato tramite cURL inviando una richiesta SOAP.

Ora avviamo il server eseguendo l'app di avvio sopra e passiamo al passaggio successivo.

3. Il cliente

Qui creeremo un client Spring per richiamare e testare il servizio web sopra .

Ora vediamo passo dopo passo cosa dobbiamo fare per creare un cliente.

3.1. Genera codice cliente

Innanzitutto, genereremo alcune classi utilizzando WSDL disponibile su //localhost:8080/ws/countries.wsdl. Scaricheremo e salveremo questo nella nostra cartella src / main / resources .

Per generare codice usando Maven, aggiungeremo il plugin maven-jaxb2 al nostro 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   

In particolare, nella configurazione del plugin abbiamo definito:

  • generateDirectory : la cartella in cui verranno salvati gli artefatti generati
  • generatePackage : il nome del pacchetto che gli artefatti useranno
  • schemaDirectory e schemaIncludes : la directory e il nome file per WSDL

Per eseguire il processo di generazione di JAXB, eseguiremo questo plugin semplicemente costruendo il progetto:

mvn compile

È interessante notare che gli artefatti generati qui sono gli stessi di quelli generati per il servizio.

Elenchiamo quelli che useremo:

  • Country.java e Currency.java : POJO che rappresentano il modello di dati
  • GetCountryRequest.java : il tipo di richiesta
  • GetCountryResponse.java : il tipo di risposta

Il servizio potrebbe essere distribuito ovunque nel mondo e, con solo il suo WSDL, siamo stati in grado di generare le stesse classi sul lato client del server!

3.2. CountryClient

Successivamente, dobbiamo estendere il WebServiceGatewaySupport di Spring per interagire con il servizio web.

Chiameremo questa 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; } }

Qui, abbiamo definito un unico metodo getCountry , corrispondente all'operazione che il servizio web aveva esposto. Nel metodo, abbiamo creato un'istanza GetCountryRequest e invocato il servizio Web per ottenere una GetCountryResponse . In altre parole, qui è dove abbiamo eseguito lo scambio SOAP .

Come possiamo vedere, Spring ha reso l'invocazione piuttosto semplice con il suo WebServiceTemplate . Abbiamo utilizzato il metodo marshalSendAndReceive del modello per eseguire lo scambio SOAP.

Le conversioni XML vengono gestite qui tramite un Marshaller collegato .

Ora diamo un'occhiata alla configurazione da cui proviene questo Marshaller .

3.3. CountryClientConfig

Tutto ciò di cui abbiamo bisogno per configurare il nostro client Spring WS sono due bean.

Innanzitutto, un Jaxb2Marshaller per convertire i messaggi da e verso XML e, in secondo luogo, il nostro CountryClient , che collegherà il 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; } } 

Qui, dobbiamo fare attenzione che il percorso di contesto del marshaller sia lo stesso di generatePackage specificato nella configurazione del plugin del nostro pom.xml .

Si prega di notare anche l'URI predefinito per il client qui. È impostato come il percorso soap: address specificato nel WSDL.

4. Testare il client

Successivamente, scriveremo un test JUnit per verificare che il nostro client funzioni come previsto:

@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()); } } 

Come possiamo vedere, abbiamo collegato il bean CountryClient definito nel nostro CountryClientConfig . Quindi, abbiamo utilizzato getCountry per richiamare il servizio remoto come descritto in precedenza.

Inoltre, siamo stati in grado di estrarre le informazioni di cui avevamo bisogno per le nostre affermazioni utilizzando il modello di dati generato POJO, Paese e Valuta .

5. conclusione

In questo tutorial, abbiamo visto le nozioni di base su come richiamare un servizio Web SOAP utilizzando Spring WS .

Abbiamo solo scalfito la superficie di ciò che Spring ha da offrire nell'area dei servizi web SOAP; c'è molto da esplorare.

Come sempre, il codice sorgente è disponibile su GitHub.