Manejo de excepciones en solicitudes JSF ajax

¿Cómo manejo la excepción y el acceso al rastreo de la stack cuando se lanza una excepción al procesar una solicitud JJA AJAA? En este momento, solo obtengo el nombre y el mensaje de la clase de excepción en una alerta de JavaScript cuando la etapa del proyecto JSF está configurada en Desarrollo. Lo que es peor, no hay comentarios visuales cuando la etapa del proyecto JSF está configurada en Producción, y el registro del servidor no muestra ninguna información sobre la excepción.

Si eso es relevante, estoy usando GlassFish en Netbeans.

Este problema se conoce y se desarrolla, entre otros, en la presentación de OmniFaces FullAjaxExceptionHandler .

Básicamente, debe crear un ExceptionHandler personalizado como estándar. JSF no proporciona uno al margen (al menos, no es razonable). Allí podrá tener acceso a la instancia de Exception causa todos los problemas.

Aquí hay un ejemplo de inicio:

 public class YourExceptionHandler extends ExceptionHandlerWrapper { private ExceptionHandler wrapped; public YourExceptionHandler(ExceptionHandler wrapped) { this.wrapped = wrapped; } @Override public void handle() throws FacesException { FacesContext facesContext = FacesContext.getCurrentInstance(); for (Iterator iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) { Throwable exception = iter.next().getContext().getException(); // There it is! // Now do your thing with it. This example implementation merely prints the stack trace. exception.printStackTrace(); // You could redirect to an error page (bad practice). // Or you could render a full error page (as OmniFaces does). // Or you could show a FATAL faces message. // Or you could trigger an oncomplete script. // etc.. } getWrapped().handle(); } @Override public ExceptionHandler getWrapped() { return wrapped; } } 

Para que se ejecute, cree una ExceptionHandlerFactory personalizada de la siguiente manera:

 public class YourExceptionHandlerFactory extends ExceptionHandlerFactory { private ExceptionHandlerFactory parent; public YourExceptionHandlerFactory(ExceptionHandlerFactory parent) { this.parent = parent; } @Override public ExceptionHandler getExceptionHandler() { return new YourExceptionHandler(parent.getExceptionHandler()); } } 

Que debe registrarse en faces-config.xml siguiente manera:

  com.example.YourExceptionHandlerFactory  

Ver también:

  • ¿Por qué FullAjaxExceptionHandler no realiza simplemente un ExternalContext # redirect ()?
  • La redirección de autorización en la caducidad de la sesión no funciona al enviar un formulario JSF, la página sigue siendo la misma