Qual è il modo corretto di gestire le eccezioni JSF 2.0 per i componenti AJAXified?

Ho impostato web.xml in modo che tutto ciò che è java.lang.Throwable (ovvero eventuali eccezioni o errori non rilevati) venga inoltrato a una pagina di errore. Tuttavia, per i componenti AJAXified, le eccezioni non vengono indirizzate alla pagina di errore tramite questo meccanismo.

Il test case che ho è un semplice CommandButton legato a un metodo di azione che genera sempre una RuntimeException . Sembra che la migliore pratica sarebbe quella di far sì che il metodo action FacesMessage l’eccezione e aggiunga un FacesMessage di tipo error severity. È questo che fanno le persone? C’è un modo per configurare JSF in modo tale che se il metodo del bean backing di un componente AJAXified genera un’eccezione che la pagina di errore può essere mostrata?

È necessario implementare un ExceptionHandler personalizzato per questo che fondamentalmente segue quanto segue quando si verifica un’eccezione in una richiesta Ajax:

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

Questo non è esattamente banale se si desidera prendere in considerazione le pagine di errore web.xml . Dovresti analizzare l’intero web.xml per trovare le posizioni della pagina di errore. Inoltre, quando si è verificata l’eccezione durante la risposta al rendering, in pratica dovresti ribuild l’intera vista da solo. La libreria di componenti OmniFaces ha esattamente un tale gestore di eccezioni, FullAjaxExceptionHandler . Qui puoi trovare il codice sorgente completo e l’esempio della vetrina.

Guarda anche:

  • l’utilizzo di ExternalContext.dispatch nel gestore degli errori JSF causa il rendering delle pagine corrotto
  • Timeout della sessione e gestione di ViewExpiredException sulla richiesta Ajax JSF / PrimeFaces