2010-12-23 8 views
5

Ich habe Bohnen, die ich vor kurzem von einer gemanagten Bohne zu einer Frühlingsbohne umgewandelt habe.FacesContext in die Frühlingsbohne injizieren

Alles war in Ordnung, bis irgendwann das folgende Verfahren genannt wird:

Exception e = (Exception) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(
        AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY); 

An dieser Stelle Dinge sprengen, weil FacesContext.getCurrentInstance() gibt null zurück.

ist es möglich, den faces-Kontext in meine Bean zu injizieren?

+0

nur als Hintergrundinformation: if 'FacesContext.getCurrentInstance()' null zurückgibt, dann wird der Anruf wahrscheinlich außerhalb des JSF-Lebenszyklus vorgenommen werden (entweder vor der Kontext wurde initialisiert, nachdem er zerstört wurde oder in einem anderen Thread). 'FacesContext'-Instanzen haben einen Bereich pro Anfrage, der in einer' ThreadLocal'-Variable enthalten ist. – McDowell

Antwort

6

Ist es möglich, den faces Kontext in meine Bohne zu injizieren?

Nicht sicher, aber in diesem speziellen Fall wird es nicht benötigt. Die ExternalContext#getSessionMap() ist im Grunde eine Fassade zu den Attributen HttpSession. Um den Punkt, müssen Sie nur die HttpServletRequest in Ihrer Spring Bean irgendwie greifen und dann erhalten Sie die HttpSession von ihm von HttpServletRequest#getSession(). Dann können Sie auf die Sitzungsattribute durch HttpSession#getAttribute() zugreifen.

I Frühling nicht tun, aber Google lernt mich, dass Sie es erhalten könnte wie folgt aussehen:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 

Sobald das getan, können Sie einfach tun:

Exception e = (Exception) request.getSession().getAttribute(AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY); 
+0

Wie hoch ist Ihre Beratungsquote? Weißt du auch, wie ich die Beans verwalten kann, sind sie in der Sitzung? – mkoryak

+2

Auf SO bin ich glücklich genug mit einer Stimme und einer grünen Markierung. In Bezug auf verwaltete Beans werden sie als Attribute von "HttpServletRequest" (Anforderungsbereich), "HttpSession" (Sitzungsumfang) und "ServletContext" (Anwendungsumfang) sowie von ihrem verwalteten Bean-Namen als Schlüssel gespeichert. Sie wissen, JSF (und Spring) läuft nur auf "roh" Servlet-API. – BalusC

6

konfrontiert ich die genaue das gleiche Problem heute, also wollte ich diese Antwort für zukünftige Referenz veröffentlichen.

Faces kann mit injiziert werden:

@ManagedProperty("#{facesContext}") 
FacesContext faces; 

Es ist für Frühjahr Bohnen arbeitet auch bereitgestellt Spring und JSF integriert sind ordnungsgemäß in der Anwendung.

Referenz:

Integrating Spring and JSF

Injecting FacesContext

+0

Vielen Dank! Ich arbeite seit 10 Stunden daran, und diese zwei Codezeilen haben sich darum gekümmert. –

Verwandte Themen