Modul 10 · Migration Deep Dive · Stufe 3 Application Layer

SOAP

javax JAX-WS wird nachvollziehbar in Jakarta XML Web Services überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.

Remote Facade
2 → 2Produktionsdateien
30 → 30Java-Zeilen
1 → 1Testdateien
2 / 2Dependencies entfernt / neu
MITTELRisiko · Score 4

Was sich konkret ändert

DimensionLegacyModernMigrationskonsequenz
ProgrammiermodellWebMethod, WebServiceWebMethod, WebServiceAnnotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen.
Abhängigkeiten4 direkte Dependencies4 direkte Dependencies2 neu, 2 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen.
Öffentliche API2 erkannte Methoden2 erkannte MethodenMethoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag.
Datenmodellclass LegacyCalculatorEndpoint, class SoapLegacyApplicationclass ModernCalculatorEndpoint, class SoapModernApplicationFeldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet.
FehlerverhaltenLegacy-Exceptions und Rückgabewerteexplizitere Fach-/Framework-FehlerabbildungFehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden.
TestsBestands- und Golden-Master-TestsUnit-, Slice-, Contract- und IntegrationstestsDer Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt.
BetriebLegacy-Start/Lifecyclemodernes Packaging, Health und externe KonfigurationParallelbetrieb, Replay/Retry und Rückrouting müssen vor Abschaltung des Legacy-Pfads erprobt sein.
RollbackLegacy-Artefakt bleibt unverändertModern-Artefakt getrennt deploybarKein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein.

Fachlicher Vertrag: unverändert zu erhalten

  • WSDL, Namespace, Operationen und XML-Schema sind die primären Verträge.
  • SOAP Faults behalten fachliche Codes und Detailstruktur.
  • Endpoint-Adresse ist konfigurierbar und nicht im Fachcode verankert.

Hauptrisiko und Testfokus

WSDL/namespace compatibility and fault mapping

contract, SOAP fault and interoperability tests

Die Modernisierung gilt erst als abgeschlossen, wenn der fachliche Vertrag automatisiert belegt ist.

Verbindliches Code- und Rollenmapping

Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.

Legacy-Rolle / DateiModern-Rolle / DateiBedeutung
LegacyCalculatorEndpoint.javaModernCalculatorEndpoint.javajavax JAX-WS Endpoint wird Jakarta Endpoint bei stabilem SOAP-Vertrag.
SoapLegacyApplication.javaSoapModernApplication.javaEndpoint-Publishing wechselt Namespace/Runtime.

Legacy-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
LegacyCalculatorEndpoint.javaclass LegacyCalculatorEndpointWebMethod, WebServiceint add(int left, int right)Remote Facade14
SoapLegacyApplication.javaclass SoapLegacyApplicationvoid main(String[] args)16

Modern-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
ModernCalculatorEndpoint.javaclass ModernCalculatorEndpointWebMethod, WebServiceint add(int left, int right)Remote Facade14
SoapModernApplication.javaclass SoapModernApplicationvoid main(String[] args)16

Dependency- und Laufzeitmigration

StatusDependencyVersionScopePrüfung
ENTFERNTjavax.jws:javax.jws-api1.1compileLegacy-Laufzeit entfällt oder wird durch Plattform/BOM ersetzt.
ENTFERNTjavax.xml.ws:jaxws-api2.3.1compileLegacy-Laufzeit entfällt oder wird durch Plattform/BOM ersetzt.
NEUjakarta.jws:jakarta.jws-api3.0.0compileNeue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen.
NEUjakarta.xml.ws:jakarta.xml.ws-api4.0.2compileNeue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen.
GEÄNDERTcom.sun.xml.ws:jaxws-rt${jaxws.legacy.version} → ${jaxws.modern.version}compile → compileGemeinsame Dependency; Version und Scope im effektiven POM prüfen.
BEIBEHALTENorg.junit.jupiter:junit-jupiterBOM/Parent → BOM/Parenttest → testGemeinsame Dependency; Version und Scope im effektiven POM prüfen.
Direkte POM-Daten ersetzen keinen erfolgreichen Online-Build mit transitiver SBOM- und CVE-Prüfung.

Vorher-/Nachher-Codebelege

Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.

Legacy
LegacyCalculatorEndpoint.java
Modern
ModernCalculatorEndpoint.java

Migrationsbedeutung: javax JAX-WS Endpoint wird Jakarta Endpoint bei stabilem SOAP-Vertrag.

Legacy-Code

projects/10-soap/legacy/src/main/java/at/aydin/lab/soap/legacy/LegacyCalculatorEndpoint.java

package at.aydin.lab.soap.legacy;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(serviceName = "LegacyCalculatorService")
// Design Pattern: Remote Facade
// Zweck: Eine grobe, stabile SOAP-Schnittstelle schützt die interne Fachlogik.
public class LegacyCalculatorEndpoint {
    @WebMethod
    public int add(int left, int right) {
        return left + right;
    }
}

Modern-Code

projects/10-soap/modern/src/main/java/at/aydin/lab/soap/modern/ModernCalculatorEndpoint.java

package at.aydin.lab.soap.modern;

import jakarta.jws.WebMethod;
import jakarta.jws.WebService;

@WebService(serviceName = "ModernCalculatorService")
// Design Pattern: Remote Facade
// Zweck: Der Vertrag bleibt stabil, während die Laufzeit auf Jakarta migriert wird.
public class ModernCalculatorEndpoint {
    @WebMethod
    public int add(int left, int right) {
        return left + right;
    }
}
Technischen Unified Diff öffnen
--- LegacyCalculatorEndpoint.java
+++ ModernCalculatorEndpoint.java
@@ -1,12 +1,12 @@
-package at.aydin.lab.soap.legacy;
+package at.aydin.lab.soap.modern;
 
-import javax.jws.WebMethod;
-import javax.jws.WebService;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebService;
 
-@WebService(serviceName = "LegacyCalculatorService")
+@WebService(serviceName = "ModernCalculatorService")
 // Design Pattern: Remote Facade
-// Zweck: Eine grobe, stabile SOAP-Schnittstelle schützt die interne Fachlogik.
-public class LegacyCalculatorEndpoint {
+// Zweck: Der Vertrag bleibt stabil, während die Laufzeit auf Jakarta migriert wird.
+public class ModernCalculatorEndpoint {
     @WebMethod
     public int add(int left, int right) {
         return left + right;
Legacy
SoapLegacyApplication.java
Modern
SoapModernApplication.java

Migrationsbedeutung: Endpoint-Publishing wechselt Namespace/Runtime.

Legacy-Code

projects/10-soap/legacy/src/main/java/at/aydin/lab/soap/legacy/SoapLegacyApplication.java

package at.aydin.lab.soap.legacy;

import javax.xml.ws.Endpoint;

public final class SoapLegacyApplication {
    private SoapLegacyApplication() {
    }

    public static void main(String[] args) throws Exception {
        Endpoint endpoint = Endpoint.publish("http://localhost:8085/calculator", new LegacyCalculatorEndpoint());
        System.out.println("Legacy WSDL: http://localhost:8085/calculator?wsdl");
        System.out.println("ENTER beendet den Server.");
        System.in.read();
        endpoint.stop();
    }
}

Modern-Code

projects/10-soap/modern/src/main/java/at/aydin/lab/soap/modern/SoapModernApplication.java

package at.aydin.lab.soap.modern;

import jakarta.xml.ws.Endpoint;

public final class SoapModernApplication {
    private SoapModernApplication() {
    }

    public static void main(String[] args) throws Exception {
        Endpoint endpoint = Endpoint.publish("http://localhost:8086/calculator", new ModernCalculatorEndpoint());
        System.out.println("Modernes WSDL: http://localhost:8086/calculator?wsdl");
        System.out.println("ENTER beendet den Server.");
        System.in.read();
        endpoint.stop();
    }
}
Technischen Unified Diff öffnen
--- SoapLegacyApplication.java
+++ SoapModernApplication.java
@@ -1,14 +1,14 @@
-package at.aydin.lab.soap.legacy;
+package at.aydin.lab.soap.modern;
 
-import javax.xml.ws.Endpoint;
+import jakarta.xml.ws.Endpoint;
 
-public final class SoapLegacyApplication {
-    private SoapLegacyApplication() {
+public final class SoapModernApplication {
+    private SoapModernApplication() {
     }
 
     public static void main(String[] args) throws Exception {
-        Endpoint endpoint = Endpoint.publish("http://localhost:8085/calculator", new LegacyCalculatorEndpoint());
-        System.out.println("Legacy WSDL: http://localhost:8085/calculator?wsdl");
+        Endpoint endpoint = Endpoint.publish("http://localhost:8086/calculator", new ModernCalculatorEndpoint());
+        System.out.println("Modernes WSDL: http://localhost:8086/calculator?wsdl");
         System.out.println("ENTER beendet den Server.");
         System.in.read();
         endpoint.stop();

Umsetzungsplan mit Qualitäts-Gates

  1. Arbeitspaket 1
    WSDL/XSD und Beispielnachrichten versioniert sichern. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  2. Arbeitspaket 2
    javax- zu jakarta-Imports migrieren, ohne Contract-First-Artefakte zu verändern. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  3. Arbeitspaket 3
    Endpoint-Publishing und Handler/Interceptors getrennt konfigurieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  4. Arbeitspaket 4
    Legacy- und Modern-Service gegen denselben Client-Test ausführen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  5. Arbeitspaket 5
    Fault-, MTOM-, Header- und Encoding-Fälle prüfen, soweit verwendet. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  6. Arbeitspaket 6
    Consumer-Freigabe einholen, bevor alte Endpoint-URL abgeschaltet wird. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.

Konkreter Test- und Abnahmekatalog

IDEbenePrüfungerforderlicher Nachweis
10-SOAP-A01Integration/ContractWSDL-Diff enthält nur genehmigte Änderungen.Automatisierter Test und CI-Protokoll
10-SOAP-A02Integration/ContractBestehender Client kann den neuen Endpoint aufrufen.Automatisierter Test und CI-Protokoll
10-SOAP-A03Integration/ContractSOAP Faults sind kompatibel.Automatisierter Test und CI-Protokoll
10-SOAP-A04Integration/ContractNamespaces und Elementreihenfolge stimmen.Automatisierter Test und CI-Protokoll
10-SOAP-A05Integration/ContractTimeout/Transportfehler werden nachvollziehbar protokolliert.Automatisierter Test und CI-Protokoll
10-SOAP-T01UnitFachlogik ohne Container oder externen Dienst testen.Unit-Test
10-SOAP-T02RegressionLegacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen.Vergleichsreport
10-SOAP-T03NegativeFehlerhafte, leere und grenzwertige Eingaben prüfen.Negativtest
10-SOAP-T04OperationsStart, Health, Shutdown und Konfigurationsfehler prüfen.Deployment-/Startprotokoll
10-SOAP-T05ContractProtokoll, Status/Headers, Payload und Timeout gegen Consumer Contract prüfen.Contract-Test
10-SOAP-F01Fokuscontract, SOAP fault and interoperability testsModulspezifischer Testreport

Risikoregister des Moduls

RisikoAuswirkungGegenmaßnahmeGate
WSDL/namespace compatibility and fault mappingMITTELcontract, SOAP fault and interoperability testsvor Cutover
Neue Framework-/Library-LaufzeitabhängigkeitenMITTELSBOM, Lizenz-, CVE- und transitive Dependency-Prüfung im Online-Buildvor Release
Legacy-Verhalten war implizit an entfernte Library gekoppeltMITTELContract-/Golden-Master-Tests und gezielte Fehlerpfadevor Abschaltung

Konfiguration und Ressourcen

Keine zusätzlichen Ressourcen.

Rollback und Koexistenz

DNS/Proxy kann auf den javax-Endpunkt zurückgestellt werden; WSDL-Version und Persistenz müssen kompatibel bleiben.

Abbruchkriterien

  • Fachlicher Golden-Master weicht ab.
  • Daten-, Nachrichten- oder API-Kompatibilität ist ungeklärt.
  • Fehlerquote, Latenz oder Ressourcenverbrauch überschreiten das vereinbarte Limit.
  • Monitoring oder Rückfallpfad ist nicht funktionsfähig.

Definition of Done

Direkte Arbeitslinks

⌂ Cockpit