⌂ Index
Kapitel 26 · Integration

Spring Web Services für Contract-first SOAP

Typ: FrameworkVersion 2 ausführlich

Spring Web Services unterstützt dokumentgetriebene, contract-first SOAP Web Services mit XML-Marshalling, Endpoint-Mapping und WS-Security-Anbindung.

Fachliche Einordnung

Viele Enterprise-Systeme nutzen weiterhin SOAP, insbesondere bei Banken, Versicherungen, Behörden und B2B-Schnittstellen. Eine Modernisierung muss SOAP verstehen, nicht nur ersetzen.

Enterprise-Merksatz: Spring Web Services unterstützt dokumentgetriebene, contract-first SOAP Web Services mit XML-Marshalling, Endpoint-Mapping und WS-Security-Anbindung.

Technische Darstellung

SOAP Client WSDL/XSD @Endpoint Marshaller Use Case SOAP Response
Kernkonzepte
  • Contract-first mit XSD/WSDL.
  • @Endpoint und @PayloadRoot.
  • JAXB oder andere Marshalling-Technologien.
  • WS-Security für Signatur/Verschlüsselung.
  • Loose Coupling zwischen Vertrag und Implementierung.
Wann einsetzen?
  • Du betreibst oder migrierst SOAP-Schnittstellen.
  • Externe Partner verlangen WSDL-Verträge.
  • Du willst SOAP hinter einer modernen Service-Schicht kapseln.
Typische Fehler und Risiken
  • SOAP-Verträge aus Java-Klassen generieren und fachlich instabil machen.
  • XML-Validierung ignorieren.
  • SOAP direkt in Domänenmodell leaken lassen.
Legacy- und Modernisierungssicht

Bestehende JAX-WS oder WebSphere SOAP Services werden zunächst contract-first stabilisiert, dann hinter Ports/Use Cases modernisiert.

Ausführliches Beispiel

Das Beispiel zeigt bewusst nicht nur Annotationen, sondern auch die Verantwortung der Schicht. In echten Projekten sollte der technische Spring-Code an Adapter- oder Konfigurationsrändern bleiben, während die Fachlogik testbar und möglichst frameworkarm bleibt.

@Endpoint
class CustomerEndpoint {
    private static final String NAMESPACE = "https://example.com/customer/v1";
    private final CustomerQueryService service;

    @PayloadRoot(namespace = NAMESPACE, localPart = "GetCustomerRequest")
    @ResponsePayload
    GetCustomerResponse getCustomer(@RequestPayload GetCustomerRequest request) {
        CustomerView view = service.findByNumber(request.getCustomerNumber());
        GetCustomerResponse response = new GetCustomerResponse();
        response.setCustomer(CustomerSoapMapper.toSoap(view));
        return response;
    }
}
Checkliste für Reviews
  • Ist die Verantwortung des Bausteins klar: Framework steuert Lebenszyklus, Library wird gezielt benutzt?
  • Ist die Fachlogik außerhalb von Controller, Listener, Repository-Implementierung oder Konfiguration?
  • Sind Fehlerfälle, Timeouts, Security, Monitoring und Tests sichtbar modelliert?
  • Gibt es klare Grenzen zwischen DTO, Domäne, Persistence und Infrastruktur?