Hat JBoss 8 im EJB Zugriff auf den HttpServletContext?

Antwort vom

**Nein: In einem EJB bekommst du `HttpServletContext` nicht direkt, weil `ServletContext` zur Servlet-Schicht gehört und EJBs bewusst vom HTTP-/Web-Layer getrennt sind.** `ServletContext` ist Teil der Servlet-API, während EJBs ihren eigenen Container-Kontext über `EJBContext` haben; die Web- und EJB-Schicht sind in Jakarta EE/WildFly getrennte Komponentenmodelle. ([openejb.apache.org](https://openejb.apache.org/jakartaee-10.0/javadoc/jakarta/servlet/ServletContext.html)) ## Was in JBoss/WildFly stattdessen richtig ist Wenn ein Servlet einen EJB aufruft, übergibt das Servlet die benötigten Daten explizit an den EJB, statt dass der EJB selbst auf `HttpServletRequest` oder `ServletContext` zugreift. Das ist die saubere Lösung, weil dein EJB dann unabhängig von HTTP bleibt und auch aus anderen Kontexten aufrufbar ist. ([jakartaee.github.io](https://jakartaee.github.io/jakartaee-documentation/jakartaee-tutorial/9.1/web/servlets/servlets.html)) Typisch ist also: ```java @WebServlet("/test") public class MyServlet extends HttpServlet { @EJB private MyServiceBean service; protected void doGet(HttpServletRequest req, HttpServletResponse resp) { ServletContext ctx = getServletContext(); String value = ctx.getInitParameter("myParam"); service.process(value); } } ``` ```java @Stateless public class MyServiceBean { public void process(String value) { // Business-Logik ohne ServletContext } } ``` ## Wichtiger Unterschied, der oft verwechselt wird Viele meinen mit „Context“ in EJB eigentlich irgendeinen Container-Kontext. In EJB heißt das aber **nicht** `HttpServletContext`, sondern `EJBContext`. Darüber bekommst du EJB-bezogene Informationen wie Security- oder Transaktionskontext, aber keinen Zugriff auf Webobjekte. ([access.redhat.com](https://access.redhat.com/webassets/avalon/d/red_hat_jboss_enterprise_application_platform/8.1/javadocs/jakarta/ejb/EJBContext.html)) ## Wenn du globale Anwendungsdaten brauchst Dann speichere sie nicht nur im `ServletContext`, wenn sie auch von EJBs gebraucht werden. Besser ist eine gemeinsame Komponente, z. B. eine CDI-`@ApplicationScoped`-Bean oder eine Konfigurationsklasse. Der entscheidende Vorteil: Dieselben Daten sind dann sauber aus Web- und Business-Schicht nutzbar, ohne unzulässige Abhängigkeit vom Servlet-Container. Die Jakarta-EE-Kontexte unterstützen dabei sowohl Servlet- als auch EJB-Aufrufe. ([jakarta.ee](https://jakarta.ee/specifications/cdi/5.0/apidocs/jakarta/enterprise/context/package-summary)) Praktisch heißt das: **ServletContext nur für Web-spezifische Dinge, EJB für Business-Logik.** Sobald ein EJB `HttpServletContext` „braucht“, ist das fast immer ein Architekturproblem und nicht ein JBoss-8-Spezialfall.

Verwandte Fragen

Wie bekommt man in JBoss 8 in einem EJB den Principal?

In JBoss EAP 8 holst du den aktuellen EJB-Caller über EJBContext bzw. SessionContext mit getCallerPrincipal(); das ist der Standardweg. Laut Jakarta EJB liefert diese Methode ein java.security.Pr...