Kapitel 28 · SOAP
Jakarta XML Web Services SOAP
Contract-first SOAP, WSDL, JAXB und Enterprise-Integration.
Fachliche Einordnung
Jakarta XML Web Services SOAP ist im Enterprise-Kontext kein isoliertes Thema. Es beantwortet die Frage, welche Verantwortung an welcher Stelle im System liegen soll. In einem Order-&-Billing-System entscheidet diese Ebene darueber, ob eine Bestellung nachvollziehbar angenommen, validiert, persistiert, abgerechnet und an Partner- oder Legacy-Systeme weitergegeben werden kann.
Integration ist der Bereich, in dem Jakarta EE historisch stark ist: REST fuer moderne APIs, SOAP fuer stabile Altvertraege, JMS fuer asynchrone Prozesse, JCA fuer EIS-Adapter und Batch fuer Massendaten. Wichtig ist nicht die Technologie allein, sondern der kontrollierte Fehlerfall.
Technisches Modell
Das wichtigste mentale Modell lautet: API und Implementierung sind getrennt. Jakarta definiert Standards und Annotationen; die konkrete Runtime oder Library liefert das Verhalten. Dadurch kann dieselbe Fachidee auf Open Liberty, WildFly, Payara, TomEE, GlassFish oder in cloud-nativen Frameworks unterschiedlich betrieben werden.
Ausfuehrliches Beispiel
@WebService(targetNamespace = "urn:partner:billing:v1")
public class PartnerBillingEndpoint {
@Inject BillingApplicationService billing;
@WebMethod
public BillingResponse createPartnerInvoice(BillingRequest request) {
InvoiceId id = billing.createInvoice(new CreateInvoice(request.getOrderNo(), request.getAmount()));
BillingResponse response = new BillingResponse();
response.setInvoiceId(id.value());
response.setStatus("ACCEPTED");
return response;
}
}
@XmlRootElement(name = "billingRequest")
public class BillingRequest {
private String orderNo;
private BigDecimal amount;
// Getter/Setter fuer JAXB Contract
}
Typische Fehler und bessere Variante
1. Fachlogik im technischen Adapter
Besser: Resource, Servlet oder Listener nur als Adapter nutzen. Die Entscheidung liegt in Application Service und Domain-Modell.
2. Zu breite Transaktion
Besser: Transaktionsgrenzen am Use Case schneiden, externe Calls ausserhalb oder ueber Outbox/JMS entkoppeln.
3. Provider-Magie ohne Dokumentation
Besser: Jede Implementierungsentscheidung in README, ADR oder design-patterns.md vermerken.
4. Keine Betriebsdiagnose
Besser: fachliche IDs, Trace-ID, Health Checks und technische Metriken von Anfang an einbauen.
Praxis-Checkliste
- Typ klar markiert: Spezifikation, Framework, Library, Runtime oder Methodik.
- Codebeispiel trennt Adapter, Application Service, Domain und Infrastruktur.
- Fehlerfall, Security und Transaktion sind erkennbar.
- Migration von Java EE zu Jakarta EE wurde beachtet.
- Teststrategie mit Unit-, Integration- oder Container-Test ist ableitbar.