Modul 08 · Migration Deep Dive · Stufe 3 Application Layer

XML und JAXB

javax.xml.bind wird nachvollziehbar in jakarta.xml.bind überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.

MapperData Binding
3 → 3Produktionsdateien
63 → 63Java-Zeilen
1 → 1Testdateien
1 / 1Dependencies entfernt / neu
NIEDRIGRisiko · Score 1

Was sich konkret ändert

DimensionLegacyModernMigrationskonsequenz
ProgrammiermodellXmlElement, XmlRootElement, exampleXmlElement, XmlRootElement, exampleAnnotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen.
Abhängigkeiten3 direkte Dependencies3 direkte Dependencies1 neu, 1 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen.
Öffentliche API6 erkannte Methoden6 erkannte MethodenMethoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag.
Datenmodellclass LegacyCustomer, class LegacyXmlMapper, class XmlLegacyApplicationclass ModernCustomer, class ModernXmlMapper, class XmlModernApplicationFeldnamen, 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 KonfigurationGolden-Master-Dokumente und negative XXE-/Malformed-Tests sind obligatorisch.
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

  • Namespace, Elementnamen, Reihenfolge und optionale Felder bleiben schema-kompatibel.
  • Zeichensatz und Datums-/Zahlenformate ändern sich nicht unbemerkt.
  • Externe Entitäten werden nicht aufgelöst.

Hauptrisiko und Testfokus

namespace and schema compatibility

round-trip, invalid XML, encoding and XXE-negative 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
LegacyCustomer.javaModernCustomer.javajavax JAXB Model wird Jakarta JAXB Model.
LegacyXmlMapper.javaModernXmlMapper.javaMarshaller/Unmarshaller-Verantwortung bleibt erhalten.
XmlLegacyApplication.javaXmlModernApplication.javaBootstrap wird auf Jakarta Runtime umgestellt.

Legacy-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
LegacyCustomer.javaclass LegacyCustomerXmlElement, XmlRootElementString getName()
void setName(String name)
String getEmail()
void setEmail(String email)
35
LegacyXmlMapper.javaclass LegacyXmlMapperString toXml(LegacyCustomer customer)Mapper18
XmlLegacyApplication.javaclass XmlLegacyApplicationexamplevoid main(String[] args)10

Modern-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
ModernCustomer.javaclass ModernCustomerXmlElement, XmlRootElementString getName()
void setName(String name)
String getEmail()
void setEmail(String email)
35
ModernXmlMapper.javaclass ModernXmlMapperString toXml(ModernCustomer customer)Mapper18
XmlModernApplication.javaclass XmlModernApplicationexamplevoid main(String[] args)10

Dependency- und Laufzeitmigration

StatusDependencyVersionScopePrüfung
ENTFERNTjavax.xml.bind:jaxb-api2.3.1compileLegacy-Laufzeit entfällt oder wird durch Plattform/BOM ersetzt.
NEUjakarta.xml.bind:jakarta.xml.bind-api4.0.2compileNeue Laufzeit-/Testabhängigkeit; transitiv, lizenz- und security-seitig prüfen.
GEÄNDERTorg.glassfish.jaxb:jaxb-runtime${jaxb.legacy.version} → ${jaxb.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
LegacyCustomer.java
Modern
ModernCustomer.java

Migrationsbedeutung: javax JAXB Model wird Jakarta JAXB Model.

Legacy-Code

projects/08-xml-jaxb/legacy/src/main/java/at/aydin/lab/xml/legacy/LegacyCustomer.java

package at.aydin.lab.xml.legacy;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "customer")
public class LegacyCustomer {
    private String name;
    private String email;
    public LegacyCustomer() {
    }

    public LegacyCustomer(String name, String email) {
        this.name = name;
        this.email = email;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Modern-Code

projects/08-xml-jaxb/modern/src/main/java/at/aydin/lab/xml/modern/ModernCustomer.java

package at.aydin.lab.xml.modern;

import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "customer")
public class ModernCustomer {
    private String name;
    private String email;
    public ModernCustomer() {
    }

    public ModernCustomer(String name, String email) {
        this.name = name;
        this.email = email;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
Technischen Unified Diff öffnen
--- LegacyCustomer.java
+++ ModernCustomer.java
@@ -1,16 +1,16 @@
-package at.aydin.lab.xml.legacy;
+package at.aydin.lab.xml.modern;
 
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
 
 @XmlRootElement(name = "customer")
-public class LegacyCustomer {
+public class ModernCustomer {
     private String name;
     private String email;
-    public LegacyCustomer() {
+    public ModernCustomer() {
     }
 
-    public LegacyCustomer(String name, String email) {
+    public ModernCustomer(String name, String email) {
         this.name = name;
         this.email = email;
     }
Legacy
LegacyXmlMapper.java
Modern
ModernXmlMapper.java

Migrationsbedeutung: Marshaller/Unmarshaller-Verantwortung bleibt erhalten.

Legacy-Code

projects/08-xml-jaxb/legacy/src/main/java/at/aydin/lab/xml/legacy/LegacyXmlMapper.java

package at.aydin.lab.xml.legacy;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;

// Design Pattern: Mapper
// Zweck: Domänenobjekt und XML-Repräsentation werden kontrolliert ineinander überführt.
public final class LegacyXmlMapper {
    public String toXml(LegacyCustomer customer) throws Exception {
        JAXBContext context = JAXBContext.newInstance(LegacyCustomer.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter writer = new StringWriter();
        marshaller.marshal(customer, writer);
        return writer.toString();
    }
}

Modern-Code

projects/08-xml-jaxb/modern/src/main/java/at/aydin/lab/xml/modern/ModernXmlMapper.java

package at.aydin.lab.xml.modern;

import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.Marshaller;
import java.io.StringWriter;

// Design Pattern: Mapper
// Zweck: Jakarta JAXB kapselt die XML-Serialisierung hinter einer klaren API.
public final class ModernXmlMapper {
    public String toXml(ModernCustomer customer) throws Exception {
        JAXBContext context = JAXBContext.newInstance(ModernCustomer.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter writer = new StringWriter();
        marshaller.marshal(customer, writer);
        return writer.toString();
    }
}
Technischen Unified Diff öffnen
--- LegacyXmlMapper.java
+++ ModernXmlMapper.java
@@ -1,14 +1,14 @@
-package at.aydin.lab.xml.legacy;
+package at.aydin.lab.xml.modern;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Marshaller;
 import java.io.StringWriter;
 
 // Design Pattern: Mapper
-// Zweck: Domänenobjekt und XML-Repräsentation werden kontrolliert ineinander überführt.
-public final class LegacyXmlMapper {
-    public String toXml(LegacyCustomer customer) throws Exception {
-        JAXBContext context = JAXBContext.newInstance(LegacyCustomer.class);
+// Zweck: Jakarta JAXB kapselt die XML-Serialisierung hinter einer klaren API.
+public final class ModernXmlMapper {
+    public String toXml(ModernCustomer customer) throws Exception {
+        JAXBContext context = JAXBContext.newInstance(ModernCustomer.class);
         Marshaller marshaller = context.createMarshaller();
         marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
         StringWriter writer = new StringWriter();
Legacy
XmlLegacyApplication.java
Modern
XmlModernApplication.java

Migrationsbedeutung: Bootstrap wird auf Jakarta Runtime umgestellt.

Legacy-Code

projects/08-xml-jaxb/legacy/src/main/java/at/aydin/lab/xml/legacy/XmlLegacyApplication.java

package at.aydin.lab.xml.legacy;

public final class XmlLegacyApplication {
    private XmlLegacyApplication() {
    }

    public static void main(String[] args) throws Exception {
        System.out.println(new LegacyXmlMapper().toXml(new LegacyCustomer("Aydin", "aydin@example.test")));
    }
}

Modern-Code

projects/08-xml-jaxb/modern/src/main/java/at/aydin/lab/xml/modern/XmlModernApplication.java

package at.aydin.lab.xml.modern;

public final class XmlModernApplication {
    private XmlModernApplication() {
    }

    public static void main(String[] args) throws Exception {
        System.out.println(new ModernXmlMapper().toXml(new ModernCustomer("Aydin", "aydin@example.test")));
    }
}
Technischen Unified Diff öffnen
--- XmlLegacyApplication.java
+++ XmlModernApplication.java
@@ -1,10 +1,10 @@
-package at.aydin.lab.xml.legacy;
+package at.aydin.lab.xml.modern;
 
-public final class XmlLegacyApplication {
-    private XmlLegacyApplication() {
+public final class XmlModernApplication {
+    private XmlModernApplication() {
     }
 
     public static void main(String[] args) throws Exception {
-        System.out.println(new LegacyXmlMapper().toXml(new LegacyCustomer("Aydin", "aydin@example.test")));
+        System.out.println(new ModernXmlMapper().toXml(new ModernCustomer("Aydin", "aydin@example.test")));
     }
 }

Umsetzungsplan mit Qualitäts-Gates

  1. Arbeitspaket 1
    Repräsentative Legacy-XMLs und XSDs als Golden Master sammeln. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  2. Arbeitspaket 2
    javax-Modelle auf jakarta-Pakete umstellen, ohne XML-Annotationen semantisch zu ändern. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  3. Arbeitspaket 3
    Marshaller-/Unmarshaller-Konfiguration explizit machen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  4. Arbeitspaket 4
    Round-trip- und Cross-Version-Tests ausführen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  5. Arbeitspaket 5
    Unknown-Field- und Versionierungsstrategie festlegen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  6. Arbeitspaket 6
    Legacy Mapper erst nach Partner-/Schemafreigabe entfernen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.

Konkreter Test- und Abnahmekatalog

IDEbenePrüfungerforderlicher Nachweis
08-XML-JAXB-A01Integration/ContractLegacy-XML wird vom Modern Mapper gelesen.Automatisierter Test und CI-Protokoll
08-XML-JAXB-A02Integration/ContractModern erzeugtes XML erfüllt das bestehende Schema.Automatisierter Test und CI-Protokoll
08-XML-JAXB-A03Integration/ContractRound-trip verliert keine Pflichtinformationen.Automatisierter Test und CI-Protokoll
08-XML-JAXB-A04Integration/ContractUngültiges XML wird sauber abgewiesen.Automatisierter Test und CI-Protokoll
08-XML-JAXB-A05Integration/ContractXXE-Test bleibt negativ.Automatisierter Test und CI-Protokoll
08-XML-JAXB-T01UnitFachlogik ohne Container oder externen Dienst testen.Unit-Test
08-XML-JAXB-T02RegressionLegacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen.Vergleichsreport
08-XML-JAXB-T03NegativeFehlerhafte, leere und grenzwertige Eingaben prüfen.Negativtest
08-XML-JAXB-T04OperationsStart, Health, Shutdown und Konfigurationsfehler prüfen.Deployment-/Startprotokoll
08-XML-JAXB-T05SecurityXXE, externe Entitäten und malformed XML negativ testen.Security-Test
08-XML-JAXB-F01Fokusround-trip, invalid XML, encoding and XXE-negative testsModulspezifischer Testreport

Risikoregister des Moduls

RisikoAuswirkungGegenmaßnahmeGate
namespace and schema compatibilityNIEDRIGround-trip, invalid XML, encoding and XXE-negative 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

Beide Mapper können hinter einer gemeinsamen Schnittstelle anhand Dokumentversion oder Feature Flag ausgewählt werden.

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