2012-12-26 8 views
12

Come si recupera FacesContext in un filtro?Come recuperare FacesContext all'interno di un filtro

ho seguito l'articolo seguente su come recuperare il FacesContext in un Filter:

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

Ma il problema è che non sta lavorando con portata Flash. A seguito di NPE è gettato:

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) 

voglio aggiungere reindirizzamento nel mio filtro e utilizzare la portata flash per salvare alcuni dati e anche i messaggi, che non funziona.

risposta

21

Come si recupera FacesContext in un filtro?

Non è possibile. Lo FacesContext viene creato dallo FacesServlet e quindi disponibile solo all'interno di qualsiasi codice Java elaborato dallo FacesServlet, che copre tutte le risorse utente JSF, come bean gestiti e listener di fasi. L'articolo mostra solo come creare manualmente lo FacesContext, ma questo approccio è in definitiva inutile. Lo standard FacesContext è solo un'astrazione di tutto ciò che è già disponibile dalle API Servlet standard come HttpServletRequest, HttpSession, ServletContext, ecc. Semplicemente utilizzale direttamente come fa JSF "sotto i cofani".

hai 2 opzioni:

  1. utilizzare un JSF PhaseListener invece. A seconda del concreto requisito funzionale di cui non hai detto nulla, questa potrebbe essere una soluzione o una soluzione alquanto maldestra.

  2. Non utilizzare la funzione di ambito di Flash fornita da JSF, ma quella di homebrew. Il principio è piuttosto semplice: impostare un cookie sulla richiesta iniziale, inviare un reindirizzamento, nella richiesta reindirizzata cercare il cookie e rimuoverlo (in modo che non ci sia più su nessuna richiesta successiva). Questo è esattamente il modo in cui l'ambito del flash JSF funziona sotto i cofani. Vedi anche Set notification message as request attribute which should show after sendRedirect per un esempio concreto.

+0

"quindi disponibile solo all'interno di qualsiasi codice Java elaborato da FacesServlet, che copre tutti gli artefatti JSF, come i bean gestiti" Ora sono confuso. Quando cerco un bean gestito usando 'HttpSession.getAttribute()' l'attuale FacesContext è ancora nullo. – djmj

+1

Il filtro viene eseguito prima di 'FacesServlet'. Quindi ottenere il bean gestito con scope della sessione da lì dove JSF ha memorizzato "sotto le copertine" prima dell'esecuzione di 'FacesServlet' non ti dà accesso a' FacesContext'. – BalusC

+0

Questo spiega il comportamento. Grazie mille per la tua risposta :) – djmj

Problemi correlati