Fachlicher Vertrag: unverändert zu erhalten
- Konfigurationspriorität und Defaults sind dokumentiert.
- Pflichtwerte werden früh validiert.
- Secrets gelangen nicht in Build-Artefakte oder Logs.
String-Properties und Build-Filterung wird nachvollziehbar in typisierte Konfiguration mit Validierung ü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 | imperativ / ohne Framework-Annotationen | explizite Java-Abstraktionen | Annotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen. |
| Abhängigkeiten | 1 direkte Dependencies | 1 direkte Dependencies | 0 neu, 0 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen. |
| Öffentliche API | 2 erkannte Methoden | 1 erkannte Methoden | Methoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag. |
| Datenmodell | class LegacyPropertiesConfig | class ConfigFactory, record ApplicationConfig | 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 | Clean Build in CI, reproduzierbare Artefakte und Umgebungsmatrix prüfen. |
| 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. |
missing keys, precedence and environment drift
default, override, malformed and encoding tests
Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.
| Legacy-Rolle / Datei | Modern-Rolle / Datei | Bedeutung |
|---|---|---|
| LegacyPropertiesConfig.java | ApplicationConfig.java + ConfigFactory.java | String-Properties werden validiertes Konfigurationsobjekt. |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| LegacyPropertiesConfig.java | class LegacyPropertiesConfig | — | String get(String key) int getInt(String key) | Configuration Object – bündelt untypisierte Properties in einem Zugriffspunkt. | 20 |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| ApplicationConfig.java | record ApplicationConfig | — | — | Configuration Object | 9 |
| ConfigFactory.java | class ConfigFactory | — | ApplicationConfig from(Properties p, Map<String, String> env) | Factory | 13 |
| Status | Dependency | Version | Scope | Prüfung |
|---|---|---|---|---|
| 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: String-Properties werden validiertes Konfigurationsobjekt.
package at.aydin.lab.config.legacy;
// Design Pattern: Configuration Object – bündelt untypisierte Properties in einem Zugriffspunkt.
import java.io.*;
import java.util.*;
public final class LegacyPropertiesConfig {
private final Properties properties = new Properties();
public LegacyPropertiesConfig(InputStream in) throws IOException {
properties.load(in);
}
public String get(String key) {
return properties.getProperty(key);
}
public int getInt(String key) {
return Integer.parseInt(get(key));
}
}
package at.aydin.lab.config.modern;
// Design Pattern: Configuration Object
// Zweck: Zusammengehörige Einstellungen werden typisiert und validiert gebündelt.
public record ApplicationConfig(int serverPort, boolean featureEnabled) {
public ApplicationConfig {
if (serverPort < 1 || serverPort > 65535) throw new IllegalArgumentException("serverPort");
}
}
package at.aydin.lab.config.modern;
import java.util.*;
// Design Pattern: Factory
// Zweck: Zentralisiert Priorität, Parsing und Validierung verschiedener Konfigurationsquellen.
public final class ConfigFactory {
public ApplicationConfig from(Properties p, Map<String, String> env) {
int port = Integer.parseInt(env.getOrDefault("APP_PORT", p.getProperty("server.port", "8080")));
boolean enabled = Boolean.parseBoolean(env.getOrDefault("FEATURE_ENABLED", p.getProperty("feature.enabled", "false")));
return new ApplicationConfig(port, enabled);
}
}
| ID | Ebene | Prüfung | erforderlicher Nachweis |
|---|---|---|---|
| 21-MAVEN-PROPERTIES-CONFIG-A01 | Integration/Contract | Fehlende Pflichtwerte stoppen den Start verständlich. | Automatisierter Test und CI-Protokoll |
| 21-MAVEN-PROPERTIES-CONFIG-A02 | Integration/Contract | Default und Override folgen dokumentierter Priorität. | Automatisierter Test und CI-Protokoll |
| 21-MAVEN-PROPERTIES-CONFIG-A03 | Integration/Contract | Ungültige Zahlen/Enums werden nicht still akzeptiert. | Automatisierter Test und CI-Protokoll |
| 21-MAVEN-PROPERTIES-CONFIG-A04 | Integration/Contract | Keine Secrets in gefilterten Ressourcen. | Automatisierter Test und CI-Protokoll |
| 21-MAVEN-PROPERTIES-CONFIG-A05 | Integration/Contract | Konfiguration ist in Unit-Tests ohne Maven reproduzierbar. | Automatisierter Test und CI-Protokoll |
| 21-MAVEN-PROPERTIES-CONFIG-T01 | Unit | Fachlogik ohne Container oder externen Dienst testen. | Unit-Test |
| 21-MAVEN-PROPERTIES-CONFIG-T02 | Regression | Legacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen. | Vergleichsreport |
| 21-MAVEN-PROPERTIES-CONFIG-T03 | Negative | Fehlerhafte, leere und grenzwertige Eingaben prüfen. | Negativtest |
| 21-MAVEN-PROPERTIES-CONFIG-T04 | Operations | Start, Health, Shutdown und Konfigurationsfehler prüfen. | Deployment-/Startprotokoll |
| 21-MAVEN-PROPERTIES-CONFIG-F01 | Fokus | default, override, malformed and encoding tests | Modulspezifischer Testreport |
| Risiko | Auswirkung | Gegenmaßnahme | Gate |
|---|---|---|---|
| missing keys, precedence and environment drift | NIEDRIG | default, override, malformed and encoding tests | vor Cutover |
| Seite | Ressource | Zeilen |
|---|---|---|
| Legacy | legacy/src/main/resources/application.properties | 2 |
ConfigFactory kann vorübergehend aus dem bisherigen Properties-Objekt lesen; Aufrufer sehen bereits nur ApplicationConfig.