REST, SOAP & Integration
HTTP-APIs, OpenAPI, WSDL, Bind/Process, Fehlerverträge und Versionierung.
Enterprise JavaBeispieleArchitekturOffline HTML
REST, SOAP & Integration
REST als fachlicher Vertrag
REST ist nicht nur @GetMapping. Ein gutes API beschreibt Ressourcen, Statuscodes, Fehlerformat, Idempotenz, Versionierung, Paging, Filter, Security und Observability. Für Enterprise-Systeme sind Fehlerszenarien genauso wichtig wie Erfolgsszenarien.
| HTTP-Aspekt | Gute Praxis | Beispiel |
|---|---|---|
| POST | nicht-idempotente Erzeugung oder Aktion | POST /orders |
| PUT | idempotentes Ersetzen/Anlegen | PUT /customers/{id} |
| PATCH | partielle Änderung | PATCH /orders/{id}/address |
| 409 Conflict | fachlicher Konflikt | optimistic lock, duplicate order |
| 422 Unprocessable Entity | fachliche Validierung schlägt fehl | order without lines |
SOAP: Bind und Process trennen
SOAP-Verarbeitung: Vertrag, Binding, fachlicher Prozess und Antwortvertrag.
Bei SOAP-Projekten entstehen Fehler oft dadurch, dass XML-Binding, Schema-Validierung und fachliche Verarbeitung vermischt werden. Das Binding wandelt XML in Java-Strukturen und zurück. Der Prozess führt den Use Case aus. Diese Trennung macht Tests, Fehlermapping und Migration viel leichter.
JAX-WS Endpoint: Bind und Process sichtbar trennen
@WebService(targetNamespace = "urn:partner:rating:v1", name = "PartnerRatingPort")
public interface PartnerRatingPort {
@WebMethod(operationName = "GetPartnerRating")
PartnerRatingResponse getPartnerRating(PartnerRatingRequest request);
}
@WebService(endpointInterface = "com.example.partner.PartnerRatingPort")
public class PartnerRatingEndpoint implements PartnerRatingPort {
private final PartnerRatingService service;
@Override
public PartnerRatingResponse getPartnerRating(PartnerRatingRequest request) {
// Bind: SOAP/XML wurde bereits in Java-DTOs gemappt.
// Process: hier beginnt die fachliche Verarbeitung.
return PartnerRatingResponse.from(service.calculate(request.partnerId()));
}
}
Adapter für Partner-Systeme
SOAP Adapter als Anti-Corruption Layer
public interface PartnerRatingGateway {
PartnerRating loadRating(PartnerId partnerId);
}
// Pattern: Anti-Corruption Layer - fremde SOAP-Strukturen bleiben außerhalb der Domain.
public class SoapPartnerRatingGateway implements PartnerRatingGateway {
private final PartnerRatingPort port;
@Override
public PartnerRating loadRating(PartnerId partnerId) {
PartnerRatingRequest request = PartnerRatingRequestMapper.toSoap(partnerId);
PartnerRatingResponse response = port.getPartnerRating(request);
return PartnerRatingMapper.toDomain(response);
}
}