Beispielarchitektur / Framework-AnwendungPraxisJakarta EE 11

Komplexes Enterprise-Beispiel: Order & Billing Jakarta Blueprint

Das Beispiel verbindet REST, CDI, Validation, Persistence, Transactions, Messaging und Batch in einer realistischen Order-&-Billing-Landschaft.

Einordnung
Beispielarchitektur / Framework-Anwendung
Enterprise-Rolle
Es zeigt, wie Jakarta-Spezifikationen zusammenwirken und wo klare Schichten liegen: Adapter, Application Service, Domain, Persistence und Integration.
Diagramm zu Komplexes Enterprise-Beispiel: Order & Billing Jakarta Blueprint

Fachliches Verständnis

Es zeigt, wie Jakarta-Spezifikationen zusammenwirken und wo klare Schichten liegen: Adapter, Application Service, Domain, Persistence und Integration. In der Praxis ist wichtig, die Spezifikation nicht mit der konkreten Runtime zu verwechseln. Der Standard beschreibt die portablen APIs, die Implementierung entscheidet über Konfiguration, Performance, Betrieb und Support.

Kernkonzepte

  • REST Resource als Inbound Adapter.
  • CDI Application Service als Use Case.
  • JPA Repository als Persistence Adapter.
  • JTA Transaktion als Konsistenzgrenze.
  • JMS Event als Integration.
  • Batch Job für Abrechnungslauf.

Typische Einsatzfälle

  • Senior-Entwickler-Schulung.
  • Legacy-Modernisierung planen.
  • Maven-Projekt als Basis erweitern.

Technisches Beispiel

java
@Path("/orders")
@RequestScoped
public class OrderResource {
    @Inject PlaceOrderUseCase useCase;
    @POST public Response place(@Valid PlaceOrderRequest request) {
        OrderId id = useCase.place(request.toCommand());
        return Response.accepted(new OrderAccepted(id.value())).build();
    }
}

@ApplicationScoped
public class PlaceOrderUseCase {
    @Inject OrderRepository repository;
    @Inject OrderEventPublisher publisher;

    @Transactional // Unit of Work Pattern: Use Case ist Konsistenzgrenze.
    public OrderId place(PlaceOrderCommand command) {
        Order order = Order.place(command); // Factory Method Pattern im Domainmodell.
        repository.save(order);             // Repository Pattern.
        publisher.publish(new OrderPlaced(order.id())); // Observer/Event Pattern.
        return order.id();
    }
}
Architekturregel: Jakarta APIs gehören an Systemgrenzen und Infrastrukturpunkte. Fachentscheidungen bleiben in Application Services und Domain-Modellen testbar und möglichst unabhängig vom Container.

Enterprise-Fallen

  • Alle Jakarta APIs in eine Klasse packen.
  • Keine Ports/Adapter-Trennung.
  • Events ohne Outbox/Idempotenz.

Legacy-Modernisierung

Der Blueprint ist bewusst als Modularisierungsvorlage gedacht: zuerst im Modulith, später optional als Services trennen.

Vertiefung: Review-Fragen für Senior-Entwickler
  • Welche Spezifikation ist hier wirklich nötig?
  • Welche Runtime-Funktion wird genutzt und ist sie portabel?
  • Wo liegt die Transaktionsgrenze?
  • Sind API-Verträge, DTOs und Domain-Modelle getrennt?
  • Ist der Code ohne Application Server testbar?