Para mejorar la experiencia del usuario cuando le caduquen las sesiones de JSF(JavaServer Faces) por inactividad, por actualización de la aplicación o por otras circunstancias lo haremos de la siguiente manera:
Configuramos en el fichero ‘faces-config.xml’ el ‘Exception Handler Factory’:
<factory> <exception-handler-factory> com.lostsys.xxx.exception.CustomExceptionHandlerFactory </exception-handler-factory> </factory>
Implementamos la classe configurada en el ‘Exception Handler Factory’:
public class CustomExceptionHandlerFactory extends ExceptionHandlerFactory { private ExceptionHandlerFactory parent; public CustomExceptionHandlerFactory(ExceptionHandlerFactory parent) { this.parent = parent; } @Override public ExceptionHandler getExceptionHandler() { return new CustomExceptionHandler(parent.getExceptionHandler()); } }
Finalmente ya solo nos queda implementar la classe con la lógica de negocio que estamos usando ‘CustomExceptionHandler’, en este caso, si la excepción es del tipo ‘ViewExpiredException’ muestra el mensaje “Your session have been expired. Please, reload and keep working. Thanks.”:
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 { throwable.printStackTrace(); 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(); } }
Por último, para que el mensaje aparezca, el fichero de la vista ‘xhtml’ debe contener la etiqueta: ‘<p:messages id=”messagesEdit” showDetail=”true” autoUpdate=”true” closable=”true” />’.
Implementar un control de excepciones mejora mucho la experiencia del usuario con la aplicación ya que le aporta un feedback de que algo esta saliendo mal y le ayuda a entenderlo.