¿Cuál es la forma correcta de lidiar con las excepciones JSF 2.0 para componentes AJAXified?

He configurado web.xml para que todo lo que sea java.lang.Throwable (es decir, cualquier excepción no detectada o error) se reenvíe a una página de error. Sin embargo, para los componentes AJAXified, las excepciones no se enrutan a la página de error a través de este mecanismo.

El caso de prueba que tengo es un CommandButton simple vinculado a un método de acción que siempre arroja una RuntimeException . Parece que la mejor práctica sería que el método de acción capte la excepción y agregue un FacesMessage de tipo gravedad de error. ¿Es esto lo que hace la gente? ¿Hay alguna forma de configurar JSF para que, si el método de bean de respaldo de un componente AJAX arroje una excepción, se muestre la página de error?

Necesita implementar un ExceptionHandler personalizado para esto que básicamente hace lo siguiente cuando se produce una excepción en una solicitud de Ajax:

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

Esto no es exactamente trivial si desea tener en cuenta las páginas de error web.xml . Necesitará analizar todo el web.xml para encontrar las ubicaciones de la página de error. Además, cuando se produjo la excepción durante la respuesta de renderizado, básicamente necesitaría reconstruir la vista completa usted mismo. La biblioteca de componentes OmniFaces tiene exactamente un manejador de excepción, FullAjaxExceptionHandler . Aquí puede encontrar el código fuente completo aquí y el ejemplo del escaparate.

Ver también:

  • el uso de ExternalContext.dispatch en el controlador de errores JSF causa la representación de páginas dañadas
  • Tiempo de espera de la sesión y manejo de ViewExpiredException en la solicitud JSF / PrimeFaces ajax