REST, SOAP & Integration

HTTP-APIs, OpenAPI, WSDL, Bind/Process, Fehlerverträge und Versionierung.

Enterprise JavaBeispieleArchitekturOffline HTML
REST, SOAP & Integration
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-AspektGute PraxisBeispiel
POSTnicht-idempotente Erzeugung oder AktionPOST /orders
PUTidempotentes Ersetzen/AnlegenPUT /customers/{id}
PATCHpartielle ÄnderungPATCH /orders/{id}/address
409 Conflictfachlicher Konfliktoptimistic lock, duplicate order
422 Unprocessable Entityfachliche Validierung schlägt fehlorder without lines

SOAP: Bind und Process trennen

SOAP-Verarbeitung: Vertrag, Binding, fachlicher Prozess und Antwortvertrag.
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);
    }
}
⌂ Cockpit