Wie bekomme ich eine SessionScoped CDI-bean aus einem Filter?
Diese Frage ist in Bezug auf einen vorherigen auf schreiben Sie einen session-timeout-handler -.
Die Antwort in diesem thread beteiligten den Zugriff auf die verschiedenen session-scoped managed beans aus dem servlet. Die Empfehlung (wie gesehen hier) ist dazu in die filter:
HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
Vermutlich diese holt eine session-bean der Klasse Benutzer. Das problem ist das funktioniert nicht.
Was schief geht sind, dass die Bohnen gibt es in der session-Attribute, aber Sie sind eingehüllt durch Schweißen Einrichtungen. Ich schrieb die doFilter () - Methode wie folgt:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String sp = req.getServletPath();
System.out.println("------------------------");
System.out.println("doFilter(): " + sp);
if (!sp.startsWith("/javax")) { //eliminates many requests
HttpSession session = req.getSession();
Enumeration<String> en = session.getAttributeNames();
int count = 0;
while (en.hasMoreElements()) {
String e = en.nextElement();
System.out.println("Attribute " + ++count + ": " + e);
}
}
chain.doFilter(request, response);
}
Wenn diese dumps aus der session-Attribute, die ich in der Regel erhalten Sie so etwas wie dieses:
INFO: ------------------------
INFO: doFilter(): /Display.xhtml
INFO: Attribute 1: org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-WEB-INF/lib/myfaces-extcdi-bundle-jsf20-1.0.1-ManagedBean-class org.apache.myfaces.extensions.cdi.jsf.impl.scope.conversation.EditableWindowContextManagerProxy
INFO: Attribute 2: org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-MyApp5-ManagedBean-class com.app.Login
INFO: Attribute 3: org.jboss.weld.context.conversation.ConversationIdGenerator
INFO: Attribute 4: com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
INFO: Attribute 5: org.jboss.weld.context.ConversationContext.conversations
INFO: Attribute 6: facelets.ui.DebugOutput
INFO: Attribute 7: javax.faces.request.charset
INFO: Attribute 8: org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContext:EXISTING_WINDOW_ID_LIST
Attribut #2 scheint die Bohne, was ich will. Unnötig zu sagen, ein Aufruf Sitzung.getAttribute("login") nicht funktioniert.
Kann mir jemand sagen, wie man Zugriff auf die zugrunde liegenden managed bean? Ich würde es vorziehen, es zu tun in einer Weise, die war nicht gebunden zu Schweißen, aber das kann nicht möglich sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Ansatz funktioniert bei session-scoped JSF
@ManagedBean
nur, nicht für CDI -@Named
bean.Müssen Sie
@Inject
es als eine Eigenschaft des filters.@Named
und ein@Inject
des Login bean. Es hat geklappt! Ich hatte keine Ahnung, dass die CDI-service arbeiten würde, in einem Filter. Ich nehme an, dies bedeutet, dass die Filter - Objekt instanziiert für jede Anforderung Zyklus, nicht nur einmal für die Servlet-Lebensdauer.@WebFilter
. Würde ich eher nicht machen, es@Named
(ähnlich@Inject
sollte in@WebServlet
servlets als auch). Die CDI ist eher ein proxy. Die Objekte injiziert werden auf eine threadlocal-basis, die zu-sein-injizierten Instanz muss nicht von der gleichen oder einen größeren Anwendungsbereich.user
Mitglied var der filter?@Inject
.