lunes, 19 de mayo de 2014

Control de excepciones con Spring MVC

Hoy vamos a ver como podemos realizar el control de excepciones de una forma más limpia en los Controller de Spring MVC, sin tener que usar el famoso try/catch.

El control de excepciones podemos realizarlo de varias formas pero aquí indicaremos como realizarlo a nivel de clase y/o global. La forma de realizar el control será la misma lo que cambiará es el sitio donde se incluye para modificar su funcionamiento.

Veamos como hacer el control de la excepción. Creamos un método con la anotación ExceptionHandler y entre paréntesis la excepción que queremos capturar. Dentro del método podemos hacer diferentes tratamientos, en nuestro caso simplemente obtendremos el tipo de excepción y el usuario responsable. Estos datos podremos mostrarlos luego en la página de error.

@ExceptionHandler(ArithmeticException.class)
public ModelAndView handleAException(final ArithmeticException ex) {

 ModelAndView modelAndView = new ModelAndView("error.page");
 modelAndView.addObject("exception", ex.getClass().getSimpleName());
 String name = SecurityContextHolder.getContext().getAuthentication().getName();
 modelAndView.addObject("username", name);

 return modelAndView;
}


Mostramos un ejemplo de página de error y como hacemos uso de las variables pasadas:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>


Error de ${exception} producido por ${user}


El ejemplo esta hecho con Tiles, por lo tanto error.page debe estar configurado para que nos redirija a dicha página.

Ahora viene decidir que tratamiento queremos dar a el manejador de la excepción. Si quiere ser local o global. En el caso de que queramos darle un tratamiento local, debido a que va a ser un tipo de excepción que solo puede darse en un determinado Controlador, debemos incluir el método dentro de dicho Controlador. En caso de querer darle un tratamiento global, debemos incluirla en una clase que cuenten con la anotación 'ControllerAdvice', ejemplo:

@ControllerAdvice
public class ExceptionController {
    protected final Logger logger = Logger.getLogger(getClass());

    @ExceptionHandler(IOException.class)
    public ModelAndView handleIOException(final IOException ex) {
  logger.info("handleIOException - Catching: " + ex.getClass().getSimpleName());
  ModelAndView modelAndView = new ModelAndView("error.page");
  return modelAndView;
    }
}


En el caso de que queráis saber algo más podéis verlo aqui, en la documentación oficial

No hay comentarios:

Publicar un comentario