Manejo de Excepciones en SpringMVC

0
11623

En este tutorial explicaremos como gestionar excepciones y manejar estados de respuesta http, de una manera rápida y sencilla, en controladores de Spring MVC.

Índice de contenidos

1. Introducción

Spring ofrece, entre sus muchos proyectos disponibles, el framework Web MVC, diseñado alrededor del concepto de DispatchtServlet que reparte las distintas peticiones entre los manejadores existentes.
Ya en el pasado hemos visto como hacer uso de esta tecnología (como se puede ver en algunos de los tutoriales existentes… ).
En esta ocasión veremos como, con unas pocas instrucciones, somos capaces de manejar excepciones y asignarle una respuesta acorde, con esta tecnología.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: MacBook Pro 17′ (2.66 GHz Intel Core i7, 8GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Lion 10.10.3.
  • NVIDIA GeForce GT 330M 512Mb.
  • Crucial MX100 SSD 512 Gb.
  • Eclipse Mars (4.5.0).
  • Spring Framework v4.2.1.RELEASE

    • spring-core
    • spring-web
    • spring-webmvc

3. Anotación @ExceptionHandler

La anotación @ExceptionHandler se encarga de anotar un método como el encargado de realizar acciones en caso de que se lance una excepción.

@ExceptionHandler(NullPointerException.class)
public void nullPointerHandler(){
    logger.log(Level.ERROR, "NullPointerException!!!");
}

En el ejemplo anterior se muestra como hacer uso de esta anotación. Tan solo es necesario tomar el método que se va a encargar de responder en caso de error y anotarlo, estableciendo como parámetro de la anotación la excepción de la que se va a hacer responsable.

Esta anotación solo actua a nivel de métodos, y tiene un nivel de retención RUNTIME lo que hace que sólo se pueda acceder a ella en dicho espacio de tiempo.

4. Anotación @ResponseStatus

La anotación @ResponseStatus nos permite marcar un método o excepción con el código de estado http (code) y la razón (reason) que serán devueltos.

@ResponseStatus(value=HttpStatus.OK)
public String getInfo(){
    ...
}

Como podemos ver en el ejemplo anterior, se ha establecido que el método getInfo devuelva el codigo de respuesta OK, para ello Spring nos ofrece un enumerado HttpStatus con todos los posibles códigos http de retorno.

Esta anotación puede actuar sobre tipos y métodos, y tiene un nivel de retención RUNTIME lo que hace que sólo se pueda acceder a ella en dicho espacio de tiempo.

De manera adicional, como hemos visto en el comienzo de este punto, la anotación Status permite establecer la razón del código de vuelto. Este valor es un string que puede pasarse como segundo parámetro como podemos ver en el siguiente ejemplo, una versión ampliada del anterior:

@ResponseStatus(value=HttpStatus.OK, reason="Everything works fine.")
public String getInfo(){
    ...
}

5. Ejemplo completo

A continuación presentamos un ejemplo completo de una clase controladora con varios métodos manejadores de excepciones.

RestController.xml
@Controller
@RequestMapping("/restService")
public class RestController {

    private final Logger logger = LogManager.getLogger(RestController.class.getName());
            
    @ResponseStatus(value=HttpStatus.OK)
    @RequestMapping(value="/{name}", method = RequestMethod.GET)
    public @ResponseBody String getResponse(@PathVariable final String name){
        assertCorrectParameter(name);
        
        return String.format("{ \"name\": \"%s\" }", name);
    }
    
    private void assertCorrectParameter(final String name) {
        ...
    }

    @ResponseStatus(value=HttpStatus.NOT_FOUND)
    @ExceptionHandler(NullPointerException.class)
    public void nullPointerHandler(){
        logger.log(Level.ERROR, "NullPointerException!!!");
    }
    
    @ResponseStatus(value=HttpStatus.BAD_REQUEST)
    @ExceptionHandler(NumberFormatException.class)
    public void numberFormatHandler(){
        logger.log(Level.ERROR, "NumberFormatException!!!");
    }
}

En este ejemplo hemos establecido dos manejadores (nullPointerHandler y numberFormatHandler) encargados de gestionar distintas excepciones y que, según sea el caso, devolveran un estado u otro.

En el caso de las excepciones de tipo NullPointerException hemos decidido devolver un código Not Found y dejar constancia en el log del problema.

En el caso de las excepciones de tipo NumberFormatException hemos decidido devolver un código Bad Request y, como en el caso anterior, dejar constancia en el log del problema.

6. Conclusiones

Como hemos visto, podemos realizar una gestión de excepciones y un manejo de respuestas http de una manera muy sencilla y con un código muy fácil de entender a simple vista gracias a las anotaciones @ErrorHandling y @ResponseStatus que nos ofrece Spring Framework.

7. Referencias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad