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.
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.
| Dimension | Legacy | Modern | Migrationskonsequenz |
|---|---|---|---|
| Programmiermodell | WebMethod, WebService | WebMethod, WebService | Annotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen. |
| Abhängigkeiten | 4 direkte Dependencies | 4 direkte Dependencies | 2 neu, 2 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen. |
| Öffentliche API | 2 erkannte Methoden | 2 erkannte Methoden | Methoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag. |
| Datenmodell | class LegacyCalculatorEndpoint, class SoapLegacyApplication | class ModernCalculatorEndpoint, class SoapModernApplication | Feldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet. |
| Fehlerverhalten | Legacy-Exceptions und Rückgabewerte | explizitere Fach-/Framework-Fehlerabbildung | Fehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden. |
| Tests | Bestands- und Golden-Master-Tests | Unit-, Slice-, Contract- und Integrationstests | Der Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt. |
| Betrieb | Legacy-Start/Lifecycle | modernes Packaging, Health und externe Konfiguration | Parallelbetrieb, Replay/Retry und Rückrouting müssen vor Abschaltung des Legacy-Pfads erprobt sein. |
| Rollback | Legacy-Artefakt bleibt unverändert | Modern-Artefakt getrennt deploybar | Kein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein. |
WSDL/namespace compatibility and fault mapping
contract, SOAP fault and interoperability tests
Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.
| Legacy-Rolle / Datei | Modern-Rolle / Datei | Bedeutung |
|---|---|---|
| LegacyCalculatorEndpoint.java | ModernCalculatorEndpoint.java | javax JAX-WS Endpoint wird Jakarta Endpoint bei stabilem SOAP-Vertrag. |
| SoapLegacyApplication.java | SoapModernApplication.java | Endpoint-Publishing wechselt Namespace/Runtime. |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| LegacyCalculatorEndpoint.java | class LegacyCalculatorEndpoint | WebMethod, WebService | int add(int left, int right) | Remote Facade | 14 |
| SoapLegacyApplication.java | class SoapLegacyApplication | — | void main(String[] args) | — | 16 |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| ModernCalculatorEndpoint.java | class ModernCalculatorEndpoint | WebMethod, WebService | int add(int left, int right) | Remote Facade | 14 |
| SoapModernApplication.java | class SoapModernApplication | — | void main(String[] args) | — | 16 |
| Status | Dependency | Version | Scope | Prüfung |
|---|---|---|---|---|
| ENTFERNT | javax.jws:javax.jws-api | 1.1 | compile | Legacy-Laufzeit entfällt oder wird durch Plattform/BOM ersetzt. |
| ENTFERNT | javax.xml.ws:jaxws-api | 2.3.1 | compile | Legacy-Laufzeit entfällt oder wird durch Plattform/BOM ersetzt. |
| NEU | jakarta.jws:jakarta.jws-api | 3.0.0 | compile | Neue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen. |
| NEU | jakarta.xml.ws:jakarta.xml.ws-api | 4.0.2 | compile | Neue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen. |
| GEÄNDERT | com.sun.xml.ws:jaxws-rt | ${jaxws.legacy.version} → ${jaxws.modern.version} | compile → compile | Gemeinsame Dependency; Version und Scope im effektiven POM prüfen. |
| BEIBEHALTEN | org.junit.jupiter:junit-jupiter | BOM/Parent → BOM/Parent | test → test | Gemeinsame Dependency; Version und Scope im effektiven POM prüfen. |
Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.
Migrationsbedeutung: javax JAX-WS Endpoint wird Jakarta Endpoint bei stabilem SOAP-Vertrag.
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;
}
}
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;
}
}
--- 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;
Migrationsbedeutung: Endpoint-Publishing wechselt Namespace/Runtime.
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();
}
}
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();
}
}
--- 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();
| ID | Ebene | Prüfung | erforderlicher Nachweis |
|---|---|---|---|
| 10-SOAP-A01 | Integration/Contract | WSDL-Diff enthält nur genehmigte Änderungen. | Automatisierter Test und CI-Protokoll |
| 10-SOAP-A02 | Integration/Contract | Bestehender Client kann den neuen Endpoint aufrufen. | Automatisierter Test und CI-Protokoll |
| 10-SOAP-A03 | Integration/Contract | SOAP Faults sind kompatibel. | Automatisierter Test und CI-Protokoll |
| 10-SOAP-A04 | Integration/Contract | Namespaces und Elementreihenfolge stimmen. | Automatisierter Test und CI-Protokoll |
| 10-SOAP-A05 | Integration/Contract | Timeout/Transportfehler werden nachvollziehbar protokolliert. | Automatisierter Test und CI-Protokoll |
| 10-SOAP-T01 | Unit | Fachlogik ohne Container oder externen Dienst testen. | Unit-Test |
| 10-SOAP-T02 | Regression | Legacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen. | Vergleichsreport |
| 10-SOAP-T03 | Negative | Fehlerhafte, leere und grenzwertige Eingaben prüfen. | Negativtest |
| 10-SOAP-T04 | Operations | Start, Health, Shutdown und Konfigurationsfehler prüfen. | Deployment-/Startprotokoll |
| 10-SOAP-T05 | Contract | Protokoll, Status/Headers, Payload und Timeout gegen Consumer Contract prüfen. | Contract-Test |
| 10-SOAP-F01 | Fokus | contract, SOAP fault and interoperability tests | Modulspezifischer Testreport |
| Risiko | Auswirkung | Gegenmaßnahme | Gate |
|---|---|---|---|
| WSDL/namespace compatibility and fault mapping | MITTEL | contract, SOAP fault and interoperability tests | vor Cutover |
| Neue Framework-/Library-Laufzeitabhängigkeiten | MITTEL | SBOM, Lizenz-, CVE- und transitive Dependency-Prüfung im Online-Build | vor Release |
| Legacy-Verhalten war implizit an entfernte Library gekoppelt | MITTEL | Contract-/Golden-Master-Tests und gezielte Fehlerpfade | vor Abschaltung |
Keine zusätzlichen Ressourcen.
DNS/Proxy kann auf den javax-Endpunkt zurückgestellt werden; WSDL-Version und Persistenz müssen kompatibel bleiben.