Jakarta Enterprise V2

Kapitel 04 · Web API

Jakarta Servlet

Typ: Spezifikation / APIKategorie: Web APIPrioritaet: 10/10

HTTP Request/Response, Filter, Listener und Sessions als technische Basis.

Diagramm: Jakarta Servlet

Fachliche Einordnung

Jakarta Servlet ist im Enterprise-Kontext kein isoliertes Thema. Es beantwortet die Frage, welche Verantwortung an welcher Stelle im System liegen soll. In einem Order-&-Billing-System entscheidet diese Ebene darueber, ob eine Bestellung nachvollziehbar angenommen, validiert, persistiert, abgerechnet und an Partner- oder Legacy-Systeme weitergegeben werden kann.

Eine typische Enterprise-Anfrage beginnt nicht im Service, sondern bereits am Rand: Reverse Proxy, TLS, Authentifizierung, Filter, Korrelation, Payload-Grenzen und Mapping muessen als zusammenhaengende Strecke verstanden werden. Jakarta trennt diese Zustaendigkeiten bewusst: Servlet behandelt den HTTP-Unterbau, REST modelliert Ressourcen, CDI verbindet Objekte, Validation prueft Eingaben und JTA sichert Konsistenz.

Quellenanker: offizielle Jakarta- und MicroProfile-Spezifikationsseiten; Details siehe .

Technisches Modell

Das wichtigste mentale Modell lautet: API und Implementierung sind getrennt. Jakarta definiert Standards und Annotationen; die konkrete Runtime oder Library liefert das Verhalten. Dadurch kann dieselbe Fachidee auf Open Liberty, WildFly, Payara, TomEE, GlassFish oder in cloud-nativen Frameworks unterschiedlich betrieben werden.

GrenzeWelche Klasse ist Rand, Anwendung, Domain oder Infrastruktur?
FehlerfallValidierung, Timeout, Rollback, Retry und DLQ bewusst festlegen.
BetriebLogs, Metriken, Health, Traces und Konfiguration sichtbar machen.
Migration`javax.*`, Server-DDs und Provider-Features inventarisieren.

Ausfuehrliches Beispiel

java
@WebFilter("/api/*")
public class CorrelationFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        var http = (HttpServletRequest) request;
        var correlationId = Optional.ofNullable(http.getHeader("X-Correlation-Id"))
                .orElse(UUID.randomUUID().toString());
        request.setAttribute("correlationId", correlationId);
        chain.doFilter(request, response);
    }
}

@WebServlet("/health/runtime")
public class RuntimeHealthServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("application/json");
        resp.getWriter().write("{"status":"UP","correlationId":"" 
                + req.getAttribute("correlationId") + ""}");
    }
}

Typische Fehler und bessere Variante

1. Fachlogik im technischen Adapter

Besser: Resource, Servlet oder Listener nur als Adapter nutzen. Die Entscheidung liegt in Application Service und Domain-Modell.

2. Zu breite Transaktion

Besser: Transaktionsgrenzen am Use Case schneiden, externe Calls ausserhalb oder ueber Outbox/JMS entkoppeln.

3. Provider-Magie ohne Dokumentation

Besser: Jede Implementierungsentscheidung in README, ADR oder design-patterns.md vermerken.

4. Keine Betriebsdiagnose

Besser: fachliche IDs, Trace-ID, Health Checks und technische Metriken von Anfang an einbauen.

Praxis-Checkliste

  • Typ klar markiert: Spezifikation, Framework, Library, Runtime oder Methodik.
  • Codebeispiel trennt Adapter, Application Service, Domain und Infrastruktur.
  • Fehlerfall, Security und Transaktion sind erkennbar.
  • Migration von Java EE zu Jakarta EE wurde beachtet.
  • Teststrategie mit Unit-, Integration- oder Container-Test ist ableitbar.

Verwandte Kapitel