2012-12-26 22 views
12

फ़िल्टर के भीतर FacesContext को कैसे पुनर्प्राप्त करूं? मैं फ़िल्टर के भीतर FacesContext को कैसे पुनर्प्राप्त करूं?मैं फ़िल्टर

मैं कैसे एक Filter में FacesContext पुनः प्राप्त करने पर निम्नलिखित लेख का पालन किया:

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

लेकिन समस्या यह है कि यह फ्लैश गुंजाइश के साथ काम नहीं कर रहा है। बाद एनपीई फेंक दिया जाता है:

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) 

मैं अपने फिल्टर में पुनर्निर्देशन जोड़ सकते हैं और कुछ डेटा है और यह भी संदेश है, जो काम नहीं कर रहा बचाने के लिए फ़्लैश गुंजाइश उपयोग करना चाहते हैं।

उत्तर

21

मैं फ़िल्टर के भीतर FacesContext को कैसे पुनर्प्राप्त करूं?

आप नहीं कर सकते। FacesContextFacesServlet द्वारा बनाया गया है और इस प्रकार केवल FacesServlet द्वारा संसाधित किए गए किसी भी जावा कोड के भीतर उपलब्ध है, जिसमें प्रबंधित बीन्स और चरण श्रोताओं जैसे सभी जेएसएफ कलाकृतियों को शामिल किया गया है। आलेख केवल दिखाता है कि मैन्युअल रूप से FacesContext कैसे बनाएं, लेकिन यह दृष्टिकोण अंततः बेकार है। FacesContext मानक सर्वलेट एपीआई जैसे HttpServletRequest, HttpSession, ServletContext इत्यादि द्वारा पहले से उपलब्ध सब कुछ का एक अमूर्त है। बस जेएसएफ "हुड के तहत" कर रहे हैं, वैसे ही उन्हें सीधे उसी तरह उपयोग करें।

  1. एक JSF PhaseListener बजाय का उपयोग करें:

    आप 2 विकल्प हैं। कंक्रीट कार्यात्मक आवश्यकता के आधार पर आपने कुछ भी नहीं बताया, यह एक बदसूरत समाधान/कामकाज हो सकता है।

  2. जेएसएफ-प्रदत्त फ्लैश स्कोप सुविधा का उपयोग न करें, लेकिन होमब्री स्वयं को स्वयं बनाएं। सिद्धांत सरल है: शुरुआती अनुरोध पर कुकी सेट करें, पुनर्निर्देशित अनुरोध में रीडायरेक्ट भेजें, कुकी और इसे हटाएं (ताकि यह किसी भी बाद के अनुरोध पर और नहीं हो)। यह ठीक है कि जेएसएफ फ्लैश स्कोप हुड के नीचे कैसे काम करता है। एक ठोस उदाहरण के लिए Set notification message as request attribute which should show after sendRedirect भी देखें।

+0

"इस प्रकार केवल किसी भी जावा कोड के भीतर उपलब्ध है जो FacesServlet द्वारा संसाधित किया जाता है, जिसमें सभी जेएसएफ कलाकृतियों जैसे प्रबंधित बीन्स शामिल हैं" अब मैं उलझन में हूं। जब मैं 'HttpSession.getAttribute()' का उपयोग कर एक प्रबंधित बीन को देखता हूं तो वर्तमान FacesContext अभी भी शून्य है। – djmj

+1

फ़िल्टर 'FacesServlet' से पहले चलता है। इसलिए सत्र प्राप्त करने से वहां से प्रबंधित बीन स्कैन किया गया जहां जेएसएफ ने 'फेस के तहत "कवर किया है, इससे पहले कि' फेससर्वलेट 'चल रहा है, आपको' फेस कॉन्टेक्स्ट 'तक पहुंच नहीं देता है। – BalusC

+0

यह व्यवहार बताता है। आपके उत्तर के लिए बहुत धन्यवाद :) – djmj