2012-02-29 9 views
5

में त्रुटि संदेश मुद्रित करने के लिए, जब कोई अपवाद होता है तो मैं एक त्रुटि पृष्ठ पर एक कस्टम संदेश मुद्रित करना चाहता हूं।जेएसएफ में अपवाद हैंडलिंग - नए पेज

मैं इस

if(erroroccured){ 
     FacesMessage message=new FacesMessage("You must login to continue"); 
     context.addMessage(null, message); 
     FacesContext.getCurrentInstance().getExternalContext().redirect("error.xhtml"); 

    } 

error.xhtml में मैं भी

<h:messages></h:messages> 

टैग दे दिया .. जब भी अपवाद तब होता है मेरा पेज पूरी तरह से पुनः निर्देशित किया गया है की कोशिश की। लेकिन मुझे कोई त्रुटि संदेश मिल गया है।

+0

संभव डुप्लिकेट: [? कैसे JSF में अपने आवेदन की त्रुटियों को प्रदर्शित करने के] (http://stackoverflow.com/questions/315804/how-to-display-my-applications-errors-in-jsf) – oers

+0

नहीं, यह प्रश्न सत्यापन त्रुटियों के बारे में बताता है, संदेश अपवाद हैंडलिंग के बारे में पूछ रहा हूं जहां मुझे अपने कस्टम संदेश को मुद्रित करने के लिए किसी अन्य पृष्ठ पर रीडायरेक्ट करने की आवश्यकता है। लेकिन उस प्रश्न में कोई पुनर्निर्देशन नहीं होता है ... मुझे एक ही पृष्ठ में एक सत्यापन संदेश मुद्रित करने में कोई समस्या नहीं है .. समस्या मुख्य रूप से पुनर्निर्देशन में मौजूद है .. – Karthikeyan

उत्तर

8

फेस संदेश अनुरोधित हैं। एक रीडायरेक्ट मूल रूप से एक नया नया HTTP अनुरोध भेजने के लिए वेबब्रोसर को निर्देशित करता है (यही कारण है कि आप ब्राउजर एड्रेस बार में यूआरएल बदल रहे हैं)। पिछले अनुरोध में सेट किए गए चेहर संदेश निश्चित रूप से नए अनुरोध में उपलब्ध नहीं हैं।

  1. एक रीडायरेक्ट न भेजें:

    ऐसे कई तरीके है यह काम करने के लिए मिल रहे हैं। इसके बजाय एक आगे भेजें। आप ExternalContext#dispatch()

    FacesContext.getCurrentInstance().getExternalContext().dispatch("error.xhtml"); 
    

    द्वारा या बस हमेशा की तरह नेविगेट करके यह कर सकते हैं अगर आप एक कार्रवाई विधि

    return "error"; 
    
  2. एक सामान्य त्रुटि पेज गुरु टेम्पलेट बनाएँ और के लिए अलग टेम्पलेट ग्राहकों का उपयोग अंदर पहले से ही कर रहे हैं प्रत्येक व्यक्तिगत प्रकार की त्रुटि और संदेश को इसके बजाय दृश्य में डाल दें।

    <ui:composition template="/WEB-INF/templates/error.xhtml" 
        xmlns="http://www.w3.org/1999/xhtml" 
        xmlns:ui="http://java.sun.com/jsf/facelets" 
    > 
        <ui:define name="message"> 
         You must login to continue. 
        </ui:define> 
    </ui:composition> 
    

    फिर आप इस विशिष्ट त्रुटि पृष्ठ पर रीडायरेक्ट कर सकते हैं जैसे कि redirect("error-login.xhtml")

  3. कुछ त्रुटि पहचानकर्ता को अनुरोध पैरामीटर के रूप में पास करें, हालांकि redirect("error.xhtml?type=login") जैसे रीडायरेक्ट URL और दृश्य को इसे संभालने दें।

    <h:outputText value="You must login to continue." rendered="#{param.type == 'login'}" /> 
    
  4. चेहर संदेशों को फ्लैश स्कोप में रखें।

    externalContext.getFlash().setKeepMessages(true); 
    

    मोज़रारा हालांकि कुछ हद तक छोटी गाड़ी फ़्लैश स्कोप कार्यान्वयन है। वर्तमान रिलीज के साथ, यह तब काम नहीं करेगा जब आपको किसी भिन्न फ़ोल्डर पर रीडायरेक्ट करने की आवश्यकता होती है, लेकिन जब यह लक्ष्य पृष्ठ एक ही फ़ोल्डर में होता है तो यह काम करेगा।

+0

सब कुछ ठीक काम करता है, लेकिन इस अपवाद के साथ क्या करना है .. प्रतिक्रिया के बाद sendRedirect() को कॉल नहीं किया जा सकता है। – Karthikeyan

+1

जाहिर है कि कॉल श्रृंखला में कुछ अन्य कोड भी 'sendRedirect() '(या' बाहरीContext.redirect()' को कॉल कर रहा है जो कवर के तहत एक ही विधि को प्रस्तुत कर रहा है)। आपको उस कॉल को छोड़ना होगा। कुछ संकेतों के लिए यह संबंधित उत्तर भी देखें: http: // stackoverflow।com/प्रश्न/2123514/जावा-lang-illegalstateexception-नहीं कर सकते आगे के बाद प्रतिक्रिया-है-गया-समिति/2125045 # 2125045 – BalusC

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