Jakarta EE: CDI, JTA, JAX-RS, JMS und Batch

Standardbasierte Enterprise-Entwicklung mit Container-Diensten verstehen.

Enterprise JavaBeispieleArchitekturOffline HTML

Jakarta EE als Standardplattform

Jakarta EE ist eine standardisierte Plattform für Enterprise-Anwendungen. Sie liefert Spezifikationen für Dependency Injection, REST, Persistence, Transactions, Messaging, Security, Validation, Batch und weitere Bereiche. Wichtig ist die Trennung zwischen Spezifikation und Implementierung: Jakarta EE definiert APIs und Verhalten, konkrete Server oder Frameworks liefern die Runtime.

SpezifikationWofür sie gut istTypisches Missverständnis
CDIDependency Injection, Scopes, EventsCDI ist nicht nur @Inject, sondern Lebenszyklus und Kontexte
JTATransaktionsgrenzen über RessourcenTransaktion gehört an Use-Case-Grenze
JAX-RSREST Endpunkte und ClientsHTTP-Status und Fehlervertrag sind Architektur, nicht Deko
JPAObjekt/Relation-MappingEntity ist nicht automatisch Domain-Modell
JMSAsynchrone NachrichtenMessage-Verarbeitung braucht Idempotenz und DLQ

CDI und Application Service

CDI hilft, Objektgraphen kontrolliert zusammenzubauen. In Enterprise-Code sollte CDI nicht die Fachlogik ersetzen. Die Fachlogik bleibt in Domain- und Application-Services; CDI verdrahtet die Implementierungen.

Jakarta Service mit CDI und JTA
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;

@ApplicationScoped
public class InvoiceApplicationService {
    @Inject InvoiceRepository invoices;
    @Inject OrderClient orders;
    @Inject DomainEventPublisher events;

    // Pattern: Transaction Script an der Use-Case-Grenze - bewusst hier, nicht im Controller.
    @Transactional
    public InvoiceId createInvoiceFor(OrderId orderId) {
        OrderSnapshot order = orders.load(orderId);
        Invoice invoice = Invoice.from(order);
        invoices.persist(invoice);
        events.publish(new InvoiceCreated(invoice.id(), orderId));
        return invoice.id();
    }
}
Transaktion an der Use-Case-Grenze, Fachregeln im Domain-Modell.
Transaktion an der Use-Case-Grenze, Fachregeln im Domain-Modell.

JAX-RS Resource sauber schneiden

JAX-RS: Resource bleibt dünn
@Path("/invoices")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class InvoiceResource {
    @Inject InvoiceApplicationService service;

    @POST
    public Response create(CreateInvoiceRequest request) {
        InvoiceId id = service.createInvoiceFor(request.orderId());
        return Response.created(URI.create("/invoices/" + id.value()))
            .entity(new CreateInvoiceResponse(id.value()))
            .build();
    }
}
Anti-Pattern: Wenn in einer Resource SQL, externe REST-Aufrufe, Transaktionslogik und fachliche Regeln zusammenstehen, ist die Resource zur Monster-Methode geworden.

Jakarta EE 11 Modernisierung

Jakarta EE 11 ist relevant, weil es moderne Java-Sprachmerkmale besser berücksichtigt und Java 17+ als Basis setzt. Für Legacy-Projekte ist der wichtigste Schritt oft nicht sofort Jakarta EE 11, sondern die kontrollierte Migration von javax.* zu jakarta.*, die Aktualisierung des Application Servers und die Entkopplung alter EJB-/SOAP-/JSP-Schichten.

⌂ Cockpit