Aufrufen eines SOAP-Webdienstes im Frühjahr

1. Übersicht

Zuvor haben wir gesehen, wie mit Spring ein SOAP-Webdienst erstellt wird.

In diesem Tutorial erfahren Sie, wie Sie einen Spring-basierten Client erstellen, um diesen Webdienst zu nutzen .

Beim Aufrufen eines SOAP-Webdienstes in Java haben wir dasselbe mit JAX-WS RI getan.

2. Der Spring SOAP-Webdienst - eine kurze Zusammenfassung

Zuvor hatten wir im Frühjahr einen Webdienst erstellt, um die Daten eines Landes unter seinem Namen abzurufen. Bevor wir uns mit der Client-Implementierung befassen, lassen Sie uns kurz zusammenfassen, wie wir das gemacht haben.

Nach dem Contract-First-Ansatz haben wir zunächst eine XML-Schemadatei geschrieben, die die Domäne definiert. Wir haben diese XSD dann verwendet, um Klassen für das Anforderungs-, Antwort- und Datenmodell mithilfe des jaxb2-maven-Plugins zu generieren .

Danach haben wir vier Klassen codiert:

  • CountryEndpoint - Der Endpunkt, der auf die Anforderung antwortet
  • CountryRepository - das Repository im Backend zur Bereitstellung von Länderdaten
  • WebServiceConfig - Die Konfiguration, die die erforderlichen Beans definiert
  • Anwendung - die Spring Boot App, um unseren Service für den Verbrauch verfügbar zu machen

Schließlich haben wir es über cURL getestet, indem wir eine SOAP-Anfrage gesendet haben.

Starten Sie nun den Server, indem Sie die obige Boot-App ausführen und mit dem nächsten Schritt fortfahren.

3. Der Kunde

Hier erstellen wir einen Spring-Client, um den oben genannten Webdienst aufzurufen und zu testen .

Lassen Sie uns nun Schritt für Schritt sehen, was wir alles tun müssen, um einen Client zu erstellen.

3.1. Client-Code generieren

Zuerst generieren wir einige Klassen mit der WSDL, die unter //localhost:8080/ws/countries.wsdl verfügbar ist. Wir werden dies herunterladen und in unserem Ordner src / main / resources speichern .

Um Code mit Maven zu generieren, fügen wir das maven-jaxb2-Plugin zu unserer pom.xml hinzu :

 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   

Insbesondere haben wir in der Plugin-Konfiguration Folgendes definiert:

  • generateDirectory - Der Ordner, in dem die generierten Artefakte gespeichert werden
  • generatePackage - Der Paketname, den die Artefakte verwenden
  • schemaDirectory und schemaIncludes - das Verzeichnis und der Dateiname für die WSDL

Um den JAXB-Generierungsprozess auszuführen, führen wir dieses Plugin aus, indem wir einfach das Projekt erstellen:

mvn compile

Interessanterweise sind die hier generierten Artefakte dieselben wie die für den Dienst generierten.

Lassen Sie uns diejenigen auflisten, die wir verwenden werden:

  • Country.java und Currency.java - POJOs, die das Datenmodell darstellen
  • GetCountryRequest.java - der Anforderungstyp
  • GetCountryResponse.java - der Antworttyp

Der Dienst kann überall auf der Welt bereitgestellt werden, und mit nur seiner WSDL konnten wir auf Client-Seite dieselben Klassen wie auf dem Server generieren!

3.2. CountryClient

Als Nächstes müssen wir den WebServiceGatewaySupport von Spring erweitern, um mit dem Webdienst zu interagieren.

Wir nennen diese Klasse 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; } }

Hier haben wir eine einzelne Methode getCountry definiert , die der Operation entspricht, die der Webdienst verfügbar gemacht hat. In der Methode haben wir eine GetCountryRequest- Instanz erstellt und den Webdienst aufgerufen, um eine GetCountryResponse abzurufen . Mit anderen Worten, hier haben wir den SOAP-Austausch durchgeführt .

Wie wir sehen können, hat Spring den Aufruf mit seiner WebServiceTemplate ziemlich einfach gemacht . Wir haben die Methode marshalSendAndReceive der Vorlage verwendet , um den SOAP-Austausch durchzuführen.

Die XML-Konvertierungen werden hier über einen angeschlossenen Marshaller abgewickelt .

Schauen wir uns nun die Konfiguration an, aus der dieser Marshaller stammt.

3.3. CountryClientConfig

Alles, was wir brauchen, um unseren Spring WS-Client zu konfigurieren, sind zwei Beans.

Erstens ein Jaxb2Marshaller zum Konvertieren von Nachrichten in und aus XML und zweitens unser CountryClient , der die Marshaller- Bean verkabelt :

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

Hier müssen wir darauf achten, dass der Kontextpfad des Marshallers mit dem in der Plugin-Konfiguration unserer pom.xml angegebenen generatePackage identisch ist .

Bitte beachten Sie auch den Standard-URI für den Client hier. Es ist als in der WSDL angegebener Speicherort für soap: address festgelegt.

4. Testen des Clients

Als Nächstes schreiben wir einen JUnit-Test, um zu überprüfen, ob unser Client wie erwartet funktioniert:

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

Wie wir sehen können, haben wir die in unserer CountryClientConfig definierte CountryClient- Bean verkabelt . Dann haben wir getCountry verwendet , um den Remote-Dienst wie zuvor beschrieben aufzurufen.

Darüber hinaus konnten wir die Informationen, die wir für unsere Aussagen benötigten, mithilfe des generierten Datenmodells POJOs, Land und Währung extrahieren .

5. Schlussfolgerung

In diesem Tutorial haben wir die Grundlagen zum Aufrufen eines SOAP-Webdienstes mit Spring WS kennengelernt .

Wir haben lediglich die Oberfläche des Angebots von Spring im Bereich SOAP-Webdienste zerkratzt. Es gibt viel zu entdecken.

Wie immer ist der Quellcode über GitHub verfügbar.