Spring Web Services für Contract-first SOAP
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
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?