2012-05-10 19 views
22

ExceptionHandlerFactory उदाहरण मैं अब तक घटना है कि एक ViewExpiredException पकड़ा है में एक viewExpired.jsf पेज के लिए एक उपयोगकर्ता अनुप्रेषित भर में आ गए हैं सब के सब:<error-page> पुनर्निर्देशन के बजाय JSF ExceptionHandlerFactory का उपयोग क्यों करें?

public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper { 
    private ExceptionHandler wrapped; 

    public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ExceptionHandler getWrapped() { 
     return this.wrapped; 
    } 

    @Override 
    public void handle() throws FacesException { 
     for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) { 
      ExceptionQueuedEvent event = i.next(); 
      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource(); 

      Throwable t = context.getException(); 
      if (t instanceof ViewExpiredException) { 
       ViewExpiredException vee = (ViewExpiredException) t; 
       FacesContext facesContext = FacesContext.getCurrentInstance(); 
       Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap(); 
       NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler(); 
       try { 
        // Push some useful stuff to the request scope for use in the page 
        requestMap.put("currentViewId", vee.getViewId()); 
        navigationHandler.handleNavigation(facesContext, null, "/viewExpired"); 
        facesContext.renderResponse(); 
       } finally { 
        i.remove(); 
       } 
      } 
     } 

     // At this point, the queue will not contain any ViewExpiredEvents. Therefore, let the parent handle them. 
     getWrapped().handle(); 
    } 
} 

मुझे ऐसा लगता है कि सरल निम्नलिखित web.xml विन्यास मौलिक ही है और बहुत आसान:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/viewExpired.jsf</location> 
</error-page> 

इस सवाल का संकेत देता है - क्यों एक एक ExceptionHandlerFactory का प्रयोग करेंगे?

+0

क्या आपके ऊपर कोड है? यदि नहीं, तो क्या आप स्रोत क्रेडिट कर सकते हैं? – Mindwin

उत्तर

23

विशिष्ट उदाहरण केवल एक उपयोगी बात करता है: यह एक अनुरोध विशेषता के रूप में देखने के लिए आईडी सहेजता है ताकि आप उदाहरण

<h:link value="Go back to previous page" outcome="#{currentViewId}" /> 

के लिए उपयोग कर सकते हैं लेकिन यह कच्चे अनुरोध URI के रूप में काफी उपयोगी नहीं है पहले से ही उपलब्ध है <error-page> के डिफ़ॉल्ट अनुरोध विशेषता javax.servlet.error.request_uri द्वारा।

<h:outputLink value="#{requestScope['javax.servlet.error.request_uri']}">Go back to previous page</h:outputLink> 

हालांकि एक बात क्या एक कस्टम ExceptionHandler के लिए वास्तव में उपयोगी है कि यह आप ajax का अनुरोध करता दौरान अपवादों के साथ निपटने के लिए अनुमति देता है। डिफ़ॉल्ट रूप से वे क्लाइंट पक्ष में सहायक प्रतिक्रिया का कोई भी रूप नहीं है। केवल परियोजना चरण के साथ मोजररा में "विकास" पर सेट अप आपको अपवाद संदेश के साथ एक नंगे जावास्क्रिप्ट अलर्ट संदेश दिखाई देगा। लेकिन इतना ही। "उत्पादन" चरण में प्रतिक्रिया का कोई भी रूप नहीं है। एक कस्टम ExceptionHandler के साथ आप त्रुटि पृष्ठ स्थानों को खोजने के लिए web.xml को पार्स करने में सक्षम होंगे, इसके साथ एक नया UIViewRoot बनाएं और जेएसएफ को @all पर AJAX प्रतिपादन सेट करने के लिए मजबूर करें।

तो, मूल रूप से:

String errorPageLocation = "/WEB-INF/errorpages/500.xhtml"; 
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation)); 
context.getPartialViewContext().setRenderAll(true); 
context.renderResponse(); 

भी देखें इस संबंधित सवाल: What is the correct way to deal with JSF 2.0 exceptions for AJAXified components? और इस ब्लॉग: Full Ajax Exception Handler

+0

क्या ओमनीफेस 'org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory' का उपयोग 'अपवाद हैंडलर फैक्ट्री' को वैश्विक त्रुटि पृष्ठ (ओं) पर जाने के लिए अपवादों को संभालने के साथ किया जा सकता है, जब अपवाद होते हैं फेंक दिया जो इस कारखाने द्वारा लपेटा नहीं है? प्रलेखन के लिए प्रति एप्लिकेशन केवल एक अपवाद हैंडलर फैक्ट्री की आवश्यकता होती है, "* जावा सर्वर सर्वर का उपयोग कर रहे प्रत्येक वेब एप्लिकेशन के लिए एक 'अपवाद हैन्डलर फैक्ट्री' उदाहरण होना चाहिए। यह उदाहरण कॉल करने के द्वारा पोर्टेबल तरीके से अधिग्रहित किया जा सकता है। *" यह अच्छी तरह से काम करता है एक वैश्विक त्रुटि पृष्ठ के लिए, वैसे भी। – Tiny

+0

@Tiny: आप इसे बढ़ा सकते हैं। Javadoc भी देखें। 'झूठा' वापस करने के लिए 'चाहिएडलएक्सप्शन रूट()' को ओवरराइड करें (और उस घातक संदेश को जोड़ें)। – BalusC

3

यह निर्भर करता है कि आप ViewExpiredException को पुन: प्राप्त करते समय क्या करना चाहते हैं।

यदि आप सिर्फ उपयोगकर्ता त्रुटि पृष्ठ पर प्रदर्शित करना चाहते हैं तो आप इसे ऐसा कर सकते हैं जैसा आपने कहा था।

यह post आपको दिखाता है कि ViewExpiredException प्रोग्रामेटिक रूप से कैसे रोकें और इसके साथ कुछ अच्छा करें।

+1

लिंक टूटा हुआ है, कृपया एक कामकाजी लिंक जोड़ें, – aName