2010-12-23 13 views
5

मेरे पास बीन है जिसे मैंने हाल ही में एक वसंत-बीन होने के लिए प्रबंधित-बीन होने से परिवर्तित कर दिया है। जब तक कुछ बिंदु पर निम्न विधि कहा जाता हैवसंत बीन में FacesContext इंजेक्शन

सब कुछ ठीक था:

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

इस बिंदु चीजों को उड़ाने क्योंकि FacesContext.getCurrentInstance() रिटर्न शून्य पर।

क्या मेरे बीन में चेहरे के संदर्भ को इंजेक्ट करना संभव है?

+0

बस पृष्ठभूमि के माध्यम से: यदि 'FacesContext.getCurrentInstance()' अशक्त देता है, तो कॉल की संभावना JSF जीवन चक्र के बाहर या तो पहले किया जा रहा है (संदर्भ को शुरू किया गया है, इसे नष्ट करने के बाद, या एक अलग धागे पर)। 'FacesContext' उदाहरणों में' थ्रेडलोकल 'चर में आयोजित प्रति-अनुरोध स्कोप होता है। – McDowell

उत्तर

6

क्या मेरे बीन में चेहरे के संदर्भ को इंजेक्ट करना संभव है?

सुनिश्चित नहीं है, लेकिन इस विशेष मामले में इसकी आवश्यकता नहीं है। ExternalContext#getSessionMap() मूल रूप से HttpSession के गुणों के लिए एक मुखौटा है। बिंदु पर, आपको किसी भी तरह अपने स्प्रिंग बीन में HttpServletRequest को पकड़ने की आवश्यकता है और फिर HttpServletRequest#getSession() से HttpSession प्राप्त करें। फिर आप HttpSession#getAttribute() द्वारा सत्र विशेषताओं तक पहुंच सकते हैं।

मैं वसंत ऐसा नहीं करते हैं, लेकिन Google मुझे सीखता है तो आप इसे प्राप्त कर सकते हैं कि इस प्रकार है:

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

ऐसा करने के बाद, आप बस कर सकते हैं:

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

आपकी परामर्श दर क्या है? भी, क्या आप जानते हैं कि मैं प्रबंधित बीन्स कैसे प्राप्त कर सकता हूं, क्या वे सत्र में हैं? – mkoryak

+2

एसओ पर, मैं वोट और हरे रंग के निशान के साथ काफी खुश हूं। प्रबंधित बीन्स के रूप में, उन्हें 'HttpServletRequest' (अनुरोध स्कोप), 'HttpSession' (सत्र स्कोप) और' ServletContext' (एप्लिकेशन स्कोप) के गुणों के साथ-साथ उनके प्रबंधित बीन नाम के रूप में कुंजी के रूप में संग्रहीत किया जाता है। आप जानते हैं, जेएसएफ (और वसंत) सिर्फ "कच्चे" सर्वलेट एपीआई के शीर्ष पर चलता है। – BalusC

6

मैं सही का सामना करना पड़ा आज भी एक ही समस्या है, इसलिए मैं भविष्य में संदर्भ के लिए यह उत्तर पोस्ट करना चाहता था।

FacesContext का उपयोग कर इंजेक्ट किया जा सकता:

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

यह वसंत सेम के लिए भी काम करता है, स्प्रिंग और JSF प्रदान की आवेदन में ठीक से एकीकृत कर रहे हैं।

संदर्भ:

Integrating Spring and JSF

Injecting FacesContext

+0

धन्यवाद! मैं इस पर 10 घंटों तक काम कर रहा हूं, और कोड की इन दो पंक्तियों ने इसका ख्याल रखा है। –

संबंधित मुद्दे