Enterprise Order Platform - Praxisprojekt

Großer Praxis-Slice mit Maven-Multi-Modul, Domain, Application, Infrastructure, Web, Batch, Tests, Entwurfsmustern, IO, HTTP und Concurrency.

MarkdownPDFCode README
0 Treffer
Architektur Enterprise Order Platform

Projektstruktur

Der neue Codeordner ist ein Maven-Multi-Modul-Projekt mit klaren Architekturgrenzen. Die Domain kennt keine Infrastruktur. Die Application definiert Ports. Infrastructure, Web und Batch sind Adapter. Tests liegen getrennt in einem Testmodul.

enterprise-order-platform/
├─ pom.xml
├─ order-domain/
├─ order-application/
├─ order-infrastructure/
├─ order-web/
├─ order-batch/
├─ order-tests/
└─ docs/
Modul- und Build-Struktur4 Einträge

Maven Multi-Module Boundary

Englischer technischer Begriff
Maven Multi-Module Boundary
Priorität
10/10
Warum wichtig
Module schneiden Architekturgrenzen sichtbar und verhindern Abhängigkeitschaos.
Typischer Fehler
Alle Klassen liegen in einem Modul und jeder darf alles importieren.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

<modules>
  <module>order-domain</module>
  <module>order-application</module>
  <module>order-infrastructure</module>
</modules>

Ziel-Code

<modules>
  <module>order-domain</module>
  <module>order-application</module>
  <module>order-infrastructure</module>
  <module>order-web</module>
  <module>order-batch</module>
  <module>order-tests</module>
</modules>

Dependency Direction

Englischer technischer Begriff
Dependency Direction
Priorität
10/10
Warum wichtig
Richtige Abhängigkeitsrichtung schützt Domain und Use Cases vor Framework-Kopplung.
Typischer Fehler
Domain importiert Infrastruktur, weil dort die Datenbankklasse liegt.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

package domain;
import infrastructure.JpaOrderEntity;
public class Order { JpaOrderEntity entity; }

Ziel-Code

package com.acme.enterprise.order.domain;
public final class Order {
    // Keine Import-Abhaengigkeit zu JPA, HTTP oder Web.
}

Maven Compiler Release

Englischer technischer Begriff
Maven Compiler Release
Priorität
9/10
Warum wichtig
Ein einheitliches Java-Release verhindert, dass Entwickler zufällig andere Sprachfeatures bauen.
Typischer Fehler
Source/target fehlen und CI kompiliert anders als lokale Maschine.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
</plugin>

Ziel-Code

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <release>21</release>
    <showWarnings>true</showWarnings>
  </configuration>
</plugin>

Enforcer Rule

Englischer technischer Begriff
Enforcer Rule
Priorität
8/10
Warum wichtig
Build-Regeln machen falsche Maven- oder Java-Versionen früh sichtbar.
Typischer Fehler
Fehler tritt erst in Produktion oder im Container-Build auf.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

mvn package

Ziel-Code

<requireMavenVersion><version>[3.9,)</version></requireMavenVersion>
<requireJavaVersion><version>[21,)</version></requireJavaVersion>
Domain & Application Layer6 Einträge

Aggregate Root

Englischer technischer Begriff
Aggregate Root
Priorität
10/10
Warum wichtig
Ein Aggregate Root schützt fachliche Invarianten und verhindert unkontrollierte Statusänderungen.
Typischer Fehler
Controller setzt Status und Totals direkt auf beliebigen Feldern.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

order.status = "PAID";
order.total = new BigDecimal("-1.00");

Ziel-Code

public void markPaid() {
    if (status != OrderStatus.PLACED) throw new IllegalStateException();
    status = OrderStatus.PAID;
}

Value Object

Englischer technischer Begriff
Value Object
Priorität
9/10
Warum wichtig
Value Objects bündeln Validierung und verhindern primitive Obsession.
Typischer Fehler
Geldbetrag und Währung werden als lose Strings übergeben.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

void pay(String amount, String currency) {
    // 10.0, EUR?, null?
}

Ziel-Code

public record Money(BigDecimal amount, Currency currency) {
    public Money {
        if (amount.signum() < 0) throw new IllegalArgumentException();
    }
}

Command Object

Englischer technischer Begriff
Command Object
Priorität
9/10
Warum wichtig
Commands trennen API-Daten von Use-Case-Eingaben und machen Validierung stabil.
Typischer Fehler
Controller übergibt rohe Map direkt an Service.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

service.place(requestBody);

Ziel-Code

public record PlaceOrderCommand(CustomerId customerId, List<OrderLine> lines) {
    public PlaceOrderCommand { lines = List.copyOf(lines); }
}

Application Service

Englischer technischer Begriff
Application Service
Priorität
10/10
Warum wichtig
Use Cases orchestrieren Ports und Domain, enthalten aber keine technischen Details.
Typischer Fehler
Fachlogik, JDBC und HTTP stecken in einer Methode.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

public void place() {
    jdbc.save(); http.post(); status = "PLACED";
}

Ziel-Code

Order order = Order.draft(id, customerId, lines);
order.place(pricingPolicy);
repository.save(order);
order.pullEvents().forEach(events::publish);

Strategy Pricing

Englischer technischer Begriff
Strategy Pricing
Priorität
8/10
Warum wichtig
Preisregeln ändern sich häufig nach Mandant, Markt oder Vertrag.
Typischer Fehler
If/else-Kaskade im Aggregate wächst unkontrolliert.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

if (tenant.equals("A")) total = aPrice();
else if (tenant.equals("B")) total = bPrice();

Ziel-Code

public interface PricingPolicy {
    Money calculateTotal(List<OrderLine> lines);
}

Domain Event

Englischer technischer Begriff
Domain Event
Priorität
9/10
Warum wichtig
Domain Events machen fachliche Ereignisse explizit und entkoppeln Folgeverarbeitung.
Typischer Fehler
Nach dem Speichern wird irgendwo versteckt eine Mail geschickt.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

orderRepository.save(order);
mailService.sendConfirmation(order);

Ziel-Code

events.add(new OrderPlacedEvent(id, customerId, total, Instant.now()));
Ports & Adapter5 Einträge

Repository Port

Englischer technischer Begriff
Repository Port
Priorität
10/10
Warum wichtig
Der Use Case hängt an einem Vertrag, nicht an JPA, JDBC oder Datei.
Typischer Fehler
Service importiert EntityManager direkt.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

class OrderService {
    EntityManager em;
}

Ziel-Code

public interface OrderRepository {
    void save(Order order);
    Optional<Order> findById(OrderId id);
}

Infrastructure Adapter

Englischer technischer Begriff
Infrastructure Adapter
Priorität
9/10
Warum wichtig
Adapter kapseln technische Entscheidungen und bleiben austauschbar.
Typischer Fehler
Application Service kennt konkrete SQL- oder HTTP-Klassen.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

new JdbcTemplate(dataSource).update(sql);

Ziel-Code

public final class InMemoryOrderRepository implements OrderRepository {
    private final ConcurrentHashMap<OrderId, Order> orders = new ConcurrentHashMap<>();
}

Composition Root

Englischer technischer Begriff
Composition Root
Priorität
8/10
Warum wichtig
Zentrale Verdrahtung verhindert versteckte globale Abhängigkeiten.
Typischer Fehler
Überall werden statische Singletons aufgerufen.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

PaymentClient.INSTANCE.reserve(order);

Ziel-Code

PlaceOrderService service = new PlaceOrderService(ids, pricing, repository, events, unitOfWork);

DTO Mapping Boundary

Englischer technischer Begriff
DTO Mapping Boundary
Priorität
8/10
Warum wichtig
DTOs bleiben am Rand; Domain arbeitet mit fachlichen Typen.
Typischer Fehler
Request-DTO wird in die Domain durchgereicht.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

Order.create(request);

Ziel-Code

new PlaceOrderCommand(new CustomerId(request.customerId()), mappedLines);

Anti-Corruption Layer

Englischer technischer Begriff
Anti-Corruption Layer
Priorität
8/10
Warum wichtig
Fremdsystemmodelle verschmutzen nicht die eigene Domäne.
Typischer Fehler
Partner-JSON-Klassen werden im Domainmodell verwendet.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

PartnerOrder partnerOrder;
order.status = partnerOrder.state;

Ziel-Code

OrderLine line = new OrderLine(partner.sku(), partner.quantity(), Money.eur(partner.price()));
IO, Dateien & Security5 Einträge

Safe Path Policy

Englischer technischer Begriff
Safe Path Policy
Priorität
10/10
Warum wichtig
Dateioperationen brauchen Schutz gegen Path Traversal und absolute Pfade.
Typischer Fehler
Upload-Dateiname wird direkt aufgelöst.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

Path target = uploadRoot.resolve(fileName);

Ziel-Code

Path resolved = root.resolve(requestedName).normalize();
if (!resolved.startsWith(root)) throw new SecurityException();

Atomic File Move

Englischer technischer Begriff
Atomic File Move
Priorität
9/10
Warum wichtig
Exports sollen entweder vollständig oder gar nicht sichtbar sein.
Typischer Fehler
CSV wird direkt in die Zieldatei geschrieben.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

Files.writeString(target, csv);

Ziel-Code

Path tmp = Files.createTempFile(target.getParent(), "invoice-", ".tmp");
Files.writeString(tmp, csv);
Files.move(tmp, target, REPLACE_EXISTING, ATOMIC_MOVE);

UTF-8 Explicit

Englischer technischer Begriff
UTF-8 Explicit
Priorität
7/10
Warum wichtig
Explizites Encoding verhindert plattformabhängige Umlaute- und CSV-Fehler.
Typischer Fehler
Default-Encoding wird implizit genutzt.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

Files.writeString(path, content);

Ziel-Code

Files.writeString(path, content, StandardCharsets.UTF_8);

CSV Header Contract

Englischer technischer Begriff
CSV Header Contract
Priorität
7/10
Warum wichtig
Ein Header macht Batchdateien wartbarer und prüfbar.
Typischer Fehler
CSV-Spalten werden nur über Positionen erraten.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

42;PAID;19.90

Ziel-Code

orderId;status;total
42;PAID;19.90

Upload Size Limit

Englischer technischer Begriff
Upload Size Limit
Priorität
9/10
Warum wichtig
Uploads ohne Größenlimit führen zu Speicher- oder Plattenproblemen.
Typischer Fehler
InputStream wird unbegrenzt in ByteArray gelesen.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

byte[] bytes = in.readAllBytes();

Ziel-Code

long copied = in.transferTo(new BoundedOutputStream(out, 10_000_000));
if (copied > 10_000_000) throw new SecurityException("file too large");
HTTP & Integration5 Einträge

HTTP Timeout

Englischer technischer Begriff
HTTP Timeout
Priorität
10/10
Warum wichtig
Ohne Timeouts hängen Threads und Requests unkontrolliert.
Typischer Fehler
HttpClient sendet ohne Request-Timeout.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

HttpRequest request = HttpRequest.newBuilder(uri).POST(body).build();

Ziel-Code

HttpRequest request = HttpRequest.newBuilder(uri)
    .timeout(Duration.ofSeconds(4))
    .POST(body)
    .build();

Content-Type Contract

Englischer technischer Begriff
Content-Type Contract
Priorität
8/10
Warum wichtig
Schnittstellen brauchen klare Media-Type-Verträge.
Typischer Fehler
JSON wird ohne Header gesendet.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

POST(body)

Ziel-Code

header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))

Status Code Handling

Englischer technischer Begriff
Status Code Handling
Priorität
8/10
Warum wichtig
Nur 2xx als Erfolg zu behandeln verhindert stille Integrationsfehler.
Typischer Fehler
Response Body wird gelesen, Status ignoriert.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

return response.body();

Ziel-Code

if (response.statusCode() < 200 || response.statusCode() >= 300) {
    throw new IllegalStateException("payment rejected: " + response.statusCode());
}

Outbox Event Journal

Englischer technischer Begriff
Outbox Event Journal
Priorität
10/10
Warum wichtig
Outbox verhindert verlorene Events zwischen Persistenz und Messaging.
Typischer Fehler
Nach DB-Commit wird direkt HTTP/JMS aufgerufen; Fehler verliert Event.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

repository.save(order);
jms.send(event);

Ziel-Code

repository.save(order);
outbox.append(event);
// separater Publisher sendet idempotent weiter

Idempotency Key

Englischer technischer Begriff
Idempotency Key
Priorität
9/10
Warum wichtig
Wiederholte Requests dürfen keine Doppelbuchungen erzeugen.
Typischer Fehler
Retry erzeugt jedes Mal neue Zahlung.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

POST /payments { orderId: "O-1" }

Ziel-Code

header("Idempotency-Key", orderId.value())
.POST(paymentRequest)
Concurrency & Batch6 Einträge

Virtual Threads for IO

Englischer technischer Begriff
Virtual Threads for IO
Priorität
8/10
Warum wichtig
Virtual Threads eignen sich für viele blockierende IO-Aufgaben.
Typischer Fehler
Für jeden Export wird ein unkontrollierter Plattformthread gebaut.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

new Thread(exportTask).start();

Ziel-Code

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    tasks.forEach(executor::submit);
}

Bounded Queue

Englischer technischer Begriff
Bounded Queue
Priorität
10/10
Warum wichtig
Begrenzte Queues machen Überlast sichtbar und verhindern OutOfMemory.
Typischer Fehler
LinkedBlockingQueue ohne Kapazität wächst endlos.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

new LinkedBlockingQueue<String>();

Ziel-Code

new ArrayBlockingQueue<String>(500);

Backpressure Timeout

Englischer technischer Begriff
Backpressure Timeout
Priorität
9/10
Warum wichtig
Producer darf nicht endlos blockieren und muss Überlast melden.
Typischer Fehler
put blockiert dauerhaft.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

queue.put(line);

Ziel-Code

if (!queue.offer(line, 2, TimeUnit.SECONDS)) {
    throw new IllegalStateException("backpressure");
}

Interrupt Handling

Englischer technischer Begriff
Interrupt Handling
Priorität
9/10
Warum wichtig
InterruptedException darf nicht verschluckt werden.
Typischer Fehler
Catch-Block loggt nur und läuft weiter.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

catch (InterruptedException ex) {
    log.warn("ignored", ex);
}

Ziel-Code

catch (InterruptedException ex) {
    Thread.currentThread().interrupt();
    return;
}

Immutable Snapshot

Englischer technischer Begriff
Immutable Snapshot
Priorität
8/10
Warum wichtig
Nebenläufige Verarbeitung braucht stabile Eingabedaten.
Typischer Fehler
Liste wird zwischen Producer und Consumer geteilt.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

this.lines = lines;

Ziel-Code

this.lines = List.copyOf(lines);

Executor Lifecycle

Englischer technischer Begriff
Executor Lifecycle
Priorität
8/10
Warum wichtig
Executors müssen geschlossen oder geordnet heruntergefahren werden.
Typischer Fehler
ExecutorService bleibt nach Job-Ende aktiv.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

ExecutorService executor = Executors.newFixedThreadPool(8);
executor.submit(task);

Ziel-Code

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(task);
}
Testing & Qualität5 Einträge

Domain Unit Test

Englischer technischer Begriff
Domain Unit Test
Priorität
9/10
Warum wichtig
Reine Domain-Tests sind schnell und stabil.
Typischer Fehler
Nur E2E-Test prüft Preisregel über Web und Datenbank.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

callRestEndpointAndHope();

Ziel-Code

Order order = Order.draft(id, customer, lines);
order.place(new StandardPricingPolicy());
assertEquals(OrderStatus.PLACED, order.status());

Application Test with Fake Ports

Englischer technischer Begriff
Application Test with Fake Ports
Priorität
9/10
Warum wichtig
Use Cases werden ohne echte DB und ohne HTTP reproduzierbar geprüft.
Typischer Fehler
Test braucht Oracle, MQ und externes Payment-System.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

new PaymentGatewayClient(realProdUrl).reserve(id, amount);

Ziel-Code

var repository = new InMemoryOrderRepository();
var events = new JsonEventPublisher(tempJournal);

Concurrent Test Harness

Englischer technischer Begriff
Concurrent Test Harness
Priorität
8/10
Warum wichtig
Race Conditions brauchen wiederholbare Lastszenarien.
Typischer Fehler
Concurrency wird manuell im Debugger ausprobiert.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

for (int i=0; i<2; i++) new Thread(job).start();

Ziel-Code

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 1000).forEach(i -> executor.submit(job));
}

Contract Test

Englischer technischer Begriff
Contract Test
Priorität
8/10
Warum wichtig
Schnittstellenverträge verhindern kaputte Partnerintegration.
Typischer Fehler
JSON-Felder werden nur implizit in Demos geprüft.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

assertNotNull(response);

Ziel-Code

assertTrue(json.contains("orderId"));
assertTrue(json.contains("status"));

Architecture Test by Modules

Englischer technischer Begriff
Architecture Test by Modules
Priorität
7/10
Warum wichtig
Maven-Modulgrenzen sind einfache Architekturtests.
Typischer Fehler
Architekturregeln stehen nur in einer Folie.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

domain -> infrastructure import erlaubt

Ziel-Code

order-domain hat keine Dependency auf order-infrastructure; Maven verhindert falsche Richtung.
Betrieb & Dokumentation5 Einträge

ADR

Englischer technischer Begriff
ADR
Priorität
8/10
Warum wichtig
Entscheidungen bleiben nachvollziehbar, wenn Technologie später hinterfragt wird.
Typischer Fehler
Warum Hexagonal verwendet wurde, ist nirgends dokumentiert.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

README: Wir verwenden Module.

Ziel-Code

ADR-001: Kontext, Entscheidung, Folgen und akzeptierter Status.

Runbook

Englischer technischer Begriff
Runbook
Priorität
8/10
Warum wichtig
Betrieb braucht konkrete Befehle und Fehlerbilder, nicht nur Code.
Typischer Fehler
Nur Entwickler wissen, wie Import und Outbox geprüft werden.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

Bei Fehler bitte Entwickler fragen.

Ziel-Code

Build: mvn test
Pruefung: outbox/events.jsonl kontrollieren
Fehlerbild: Queue voll -> Consumer pruefen

License and Dependency Check

Englischer technischer Begriff
License and Dependency Check
Priorität
7/10
Warum wichtig
Abhängigkeiten müssen prüfbar bleiben, besonders in Enterprise-Paketen.
Typischer Fehler
Neue Dependencies werden ohne Bericht eingebaut.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

<dependency>...</dependency>

Ziel-Code

maven-dependency-plugin + versions/enforcer + Lizenzbericht im Paket.

Operational Logging Boundary

Englischer technischer Begriff
Operational Logging Boundary
Priorität
7/10
Warum wichtig
Logs gehören in Adapter und Use Cases, nicht in Value Objects.
Typischer Fehler
Domainmodell loggt technische Details.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

class Money { Logger log; }

Ziel-Code

Application Service loggt Use-Case-ID; Domain bleibt rein.

Configuration Outside Domain

Englischer technischer Begriff
Configuration Outside Domain
Priorität
8/10
Warum wichtig
Konfiguration darf Fachmodell nicht verschmutzen.
Typischer Fehler
Domain liest System.getenv.
Enterprise-Einordnung
Relevanter Baustein für wartbare Java-Enterprise-Modernisierung, CI/CD-fähige Maven-Projekte und nachvollziehbare Architekturgrenzen.

Ausgangspunkt-Code

class Order { String tenant = System.getenv("TENANT"); }

Ziel-Code

Composition Root liest Konfiguration und baut passende PricingPolicy.
Order FlowTesting Pyramid