Wie Kriege ich den FacesContext in einem Filter
Wie Kriege ich den FacesContext in einem Filter?
Folgte ich folgenden Artikel, wie Sie zum abrufen der FacesContext
im Filter
:
http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/
Aber das problem ist, dass es nicht funktioniert mit der Flash-Rahmen. Folgende NPE geworfen wird:
java.lang.NullPointerException
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:751)
at com.sun.faces.context.flash.ELFlash.getPhaseMapForWriting(ELFlash.java:785)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:392)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:112)
Möchte ich hinzufügen, dass die Umleitung in meinem filter, und verwenden Sie flash-Bereich, um Daten zu speichern und auch Nachrichten, die nicht arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht. Die
FacesContext
wird erstellt, indem dieFacesServlet
und somit nur innerhalb von Java-code die Verarbeitung derFacesServlet
umfasst alle JSF-Artefakte, wie z.B. managed beans, und phase-Listener. Der Artikel zeigt nur, wie man erstellen Sie manuell dieFacesContext
, aber dieser Ansatz ist letztlich nutzlos. DieFacesContext
ist nur eine Abstraktion von allem bereits zur Verfügung, die von standard-Servlet-API wieHttpServletRequest
,HttpSession
,ServletContext
usw. Benutzen Sie einfach direkt die gleiche Weise wie JSF tun "unter den Hauben".Haben Sie 2 Möglichkeiten:
Verwenden JSF
PhaseListener
statt. Je nach den konkreten funktionalen Anforderungen, die Sie sagen nicht etwas über, kann dies eine etwas ungeschickte Lösung/workaround.Nicht JSF verwenden-sofern Flash-scope-Einrichtung, aber homebrew selbst einer. Das Prinzip ist ziemlich einfach: ein cookie gesetzt, auf erstes anfordern, senden Sie eine Umleitung, in die umgeleitete Anfrage lookup-cookie und entfernen (so, dass es nicht mehr gibt, die auf nachträgliche Anfrage). Das ist genau, wie die JSF-Flash-Bereich arbeitet unter den Hauben. Siehe auch Meldung Meldung als request-Attribut, das zeigen soll nach sendRedirect für ein konkretes Beispiel.
HttpSession.getAttribute()
den aktuellen FacesContext ist immer noch null.FacesServlet
. So bekommen Sie die session scoped managed bean von dort, wo JSF gespeichert hat, "unter der Decke" vor denFacesServlet
laufen hat, nicht geben Ihnen Zugang zu denFacesContext
.PhaseLIstener
hören aufbeforePhase
vonRENDER_RESPONSE
gut funktionieren würde.