2012-05-10 10 views
22

Ben kadarıyla bir ViewExpiredException yakalanması durumunda bir viewExpired.jsf sayfaya kullanıcıyı yönlendirmek böylece rastlamak ExceptionHandlerFactory örneklerin hepsi:Neden <error-page> yönlendirmesi yerine bir JSF ExceptionHandlerFactory kullanıyorsunuz?

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(); 
    } 
} 

Aşağıdaki basit web.xml yapılandırma temelde aynı olduğunu bana öyle geliyor ve çok daha kolay:

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

- neden kimse bir ExceptionHandlerFactory kullanırdınız?

+0

Kod sizinki üstünde mi? değilse, kaynağı kredilendirir misiniz? – Mindwin

cevap

23

özel örnek tek faydalı şey vermez: örneğin

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

için kullanabilirsiniz Fakat bu ham istek URI'sına olarak müthiş faydalı olmadığını bu yüzden bir istek niteliği olarak görünüm kimliğinizi kaydeder zaten mevcuttur <error-page> varsayılan istek özniteliği javax.servlet.error.request_uri tarafından.

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

Ancak özel ExceptionHandler için gerçekten yararlı olanı tek şey sen ajax istekleri sırasında özel başa olanak sağlamasıdır. Varsayılan olarak, istemci tarafında tek bir yararlı geri bildirim formu yoktur. Sadece "Geliştirme" olarak ayarlanmış proje aşamasına sahip Mojarra'da istisna mesajıyla birlikte çıplak bir JavaScript uyarı mesajı göreceksiniz. Ama bu kadar. "Üretim" aşamasında tek bir geri bildirim şekli yoktur. Özel bir ExceptionHandler ile web.xml hata sayfası konumlarını bulmak, yeni bir UIViewRoot oluşturmak ve ajax oluşturma @all ayarlamak için zorlamak için JSF ayrıştırabilirsiniz. temelde Yani

, :

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

de bu ilgili soruya bakın: What is the correct way to deal with JSF 2.0 exceptions for AJAXified components? ve bu blog: Full Ajax Exception Handler.

+0

Can OmniFaces 'org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory', istisnalar olduğunda, global hata sayfalarına yönlendirmek için bu yolla bir 'ExceptionHandlerFactory' oluşturarak istisnalarla birlikte kullanılır Bu fabrika tarafından sarılmayacak olan atılmış? Dokümantasyon, uygulama başına yalnızca bir istisna işleyicisi fabrikası gerektirir, "* JavaServer Faces kullanan web uygulaması başına bir" ExceptionHandlerFactory "örneği olmalıdır. Bu örnek, taşınabilir bir şekilde, çağrılarak edinilebilir. *" Bu iyi iletme çalışır Bu arada, genel bir hata sayfasına. – Tiny

+0

@Tiny: Bunu genişletebilirsiniz. Ayrıca javadoc'a da bakınız. 'False 'i döndürmek için' needHandleExceptionRootCause()' ı geçersiz kılın (ve bu önemli mesajı ekleyin). – BalusC

3

ViewExpiredException'u geri çektiğinizde ne yapmak istediğinize bağlıdır.

Sadece bir kullanıcı hata sayfası görüntülemek istiyorsanız, bunu istediğiniz gibi yapabilirsiniz.

Bu post, ViewExpiredException'un programla nasıl programlanacağını ve bununla ilgili güzel bir şey yapmanın nasıl olduğunu gösterir.

+1

link bozuk, lütfen bir çalışma linki ekleyin, – aName