Exception handling en JSF(JavaServer Faces)

11-03-2014
 
JSF Excepcion Handler

JSF Excepcion Handler

Una de las cosas mas básicas en nuestra aplicación JSF(JavaServer Faces) será el control de excepciones. Cuando salta un error en JSF el usuario muchas veces no recibe ningún tipo de feedback, simplemente su aplicación se cuelga y nosotros vemos una traza de error en los logs del servidor.

En este ejemplo voy a configurar nuestro propio manejador de excepciones(Exception Handler). En concreto, uno que nos permitirá mostrar al usuario una ventana de PrimeFaces con el mensaje del error. Además si la excepción es del tipo ViewExpiredException le pondremos un mensaje mas personalizado.

Para implementar un sistema de exception-handling en JSF tendremos que hacer tres cosas:

1. Configurar en el fichero ‘faces-config.xml’ nuestra factoría de manejadores de excepciones.
2. Implementar nuestra clase factoría manejadora de excepciones.
3. Finalmente implementar nuestra clase manejadora de excepciones.

Primero tenemos que añadir en nuestro fichero ‘faces-config.xml’ lo isguiente:

    <factory>
      <exception-handler-factory>
        mi.package.CustomExceptionHandlerFactory
      </exception-handler-factory>
    </factory>

Después implementamos la classe ‘CustomExceptionHandlerFactory’:

package mi.package;

import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;

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

Finalmente implementamos la classe CustomExceptionHandler:

public class CustomExceptionHandler extends ExceptionHandlerWrapper {
	 private ExceptionHandler wrapped;
	  
	  public CustomExceptionHandler(ExceptionHandler wrapped) {
	    this.wrapped = wrapped;
	  }
	 
	  @Override
	  public ExceptionHandler getWrapped() {
	    return wrapped;
	  }

	  @Override
	  public void handle() throws FacesException {
	    Iterator<ExceptionQueuedEvent> iterator = getUnhandledExceptionQueuedEvents().iterator();
	    
	    while (iterator.hasNext()) {
	      ExceptionQueuedEvent event = iterator.next();
	      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource();
	      Throwable throwable = context.getException();
	      
	      try {
	    	  String error=throwable.getMessage()+"("+throwable.getClass().getName()+")";
	    	  
	    	  if ( throwable.getClass()==javax.faces.application.ViewExpiredException.class )
	    		  error="Your session have been expired. Please, reload and keep working. Thanks.";
	          
	          FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, "We are sorry :(", error );  	          
	          RequestContext.getCurrentInstance().showMessageInDialog(message);  	         	          
	      } finally {
	          iterator.remove();
	      }
	    }
	    getWrapped().handle();
	  }
}

Leave a Reply

© Albert Coronado Calzada