2012-12-26 15 views
12

Jak mogę pobrać FacesContext w filtrze?Jak pobrać FacesContext w filtrze

I następnie dodaje się artykuł o tym, jak odzyskać FacesContext w Filter:

http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/

Ale problemem jest to, że nie działa z zakresu Flash. W następstwie NPE jest wyrzucany:

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) 

chcę dodać przekierowanie w moim filtrze i wykorzystywać zakres lampy błyskowej, aby zapisać niektóre dane, a także wiadomości, które nie działa.

Odpowiedz

21

Jak mogę pobrać FaceContext w filtrze?

Nie możesz. Model FacesContext jest tworzony przez FacesServlet i dlatego jest dostępny tylko w obrębie dowolnego kodu Java, który jest przetwarzany przez FacesServlet, który obejmuje wszystkie artefakty JSF, takie jak zarządzane komponenty bean i detektory fazy. W artykule pokazano tylko, jak ręcznie utworzyć FacesContext, ale to podejście jest ostatecznie bezużyteczne. FacesContext to po prostu abstrakcja wszystkiego, co jest już dostępne w standardowym Servlet API, takim jak HttpServletRequest, HttpSession, ServletContext, itp. Po prostu użyj ich bezpośrednio w ten sam sposób, w jaki robi to JSF "pod maskami".

Masz 2 opcje:

  1. użyć JSF PhaseListener zamiast. W zależności od konkretnego wymagania funkcjonalnego, o którym nic nie mówisz, może to być raczej niezręczne rozwiązanie/obejście problemu.

  2. Nie należy używać funkcji lamp błyskowych dostarczonych przez JSF, ale należy ją samodzielnie przygotować samodzielnie. Zasada jest dość prosta: ustaw plik cookie na początkowej prośbie, wyślij przekierowanie, w przekierowanym wyszukiwaniu żądania plik cookie i usuń (tak, że już go nie ma na żadnym kolejnym żądaniu). Dokładnie tak działa zakres JSF Flash pod maskami. Zobacz także Set notification message as request attribute which should show after sendRedirect dla konkretnego przykładu.

+0

"w ten sposób dostępna jest tylko w obrębie kodu Java, który jest przetwarzany przez FacesServlet, który obejmuje wszystkie artefakty JSF, takie jak zarządzane komponenty bean" Teraz jestem zdezorientowany. Kiedy szukam zarządzanego komponentu bean za pomocą 'HttpSession.getAttribute()' obecny FaceContext jest nadal pusty. – djmj

+1

Filtr działa przed 'FacesServlet'. Zatem pobieranie skupionej na sesji części zarządzanej fasoli, z której JSF zapisywał "pod osłonami", zanim uruchomiono usługę 'FacesServlet', nie daje dostępu do' FacesContext'. – BalusC

+0

To wyjaśnia zachowanie. Wielkie dzięki za twoją odpowiedź :) – djmj

Powiązane problemy