Usar Spring 3, me gusta crear un controlador de excepción mediante el ExceptionHandler anotación que se encargará de «página no encontrada (error 404)» solicitudes. Estoy usando el siguiente código para hacer esto. Pero cuando me apunte a una URL que no existe, el valor predeterminado del controlador de excepciones definidas por la Primavera se invoca.

Podría ser que estoy manejando el NoSuchRequestHandlingMethodException excepción. Si es así, entonces ¿qué excepción debo registrar?

Por favor, eche un vistazo a el siguiente código y ver lo que estoy haciendo mal?

NOTA: Si cambio la excepción en el @ExceptionHandler a NullPointerException y crear una RequestMapping a tirar de puntero nulo, que va a funcionar.

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.web.servlet.ModelAndView;

    @Controller
    public class GeneralHandler {
      private final Log logger = LogFactory.getLog(getClass());

      @ExceptionHandler(NoSuchRequestHandlingMethodException.class)
      public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
        ModelAndView mav = new ModelAndView();
        logger.error("Exception found: " + ex);
        return mav;
      }
    }
InformationsquelleAutor sgsweb | 2010-07-12

3 Comentarios

  1. 41

    @ExceptionHandleranotados los métodos se invocan cuando un @RequestMapping método de la misma clase, se produce una excepción. Así que cuando usted agrega la asignación, y que lanzó la NullPointerException, que trabajado, ya que el mapeado método y el controlador de excepciones fueron juntos en la misma clase.

    Cuando no hay asignación se encuentra, la Primavera no tiene manera de asociar el NoSuchRequestHandlingMethodException con su @ExceptionHandler, porque no llegar tan lejos como la coincidencia de la solicitud a un método de controlador. Esto no es mencionado explícitamente en la documentación, pero es el comportamiento que he observado.

    Si quieres controlar esta excepción especialmente, vas a tener que usar la más general HandlerExceptionResolver enfoque, en lugar de la más especializados @ExceptionHandler técnica.

    • Gracias. Voy a utilizar el HandlerExceptionResolver enfoque.
    • hizo el trabajo para usted? Yo sigo teniendo el mismo problema
  2. 16

    En la Primavera de 3.2 usted puede utilizar @ContollerAdvice tener un ExceptionHandler para todos sus Controladores como este:

    @ControllerAdvice
    public class GeneralHandler {
    
       @ExceptionHandler
       public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
            ModelAndView mav = new ModelAndView();
            ...
            return mav;
       }
    }

    Usted puede incluso agregar más anotaciones para volver serializado json

    @ExceptionHandler
        @ResponseBody
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public RestError resolveBindingException ( MethodArgumentNotValidException methodArgumentNotValidException, Locale locale )
        {
            BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
            return getRestError(bindingResult, locale);
        }
    • Esto es bastante parecido a lo que terminé haciendo, pero ya que yo también uso un ContentNegotiatingViewResolver, terminé la captura de ‘Excepción’, luego envolver los que en una clase con JSON y XML serialización de anotaciones y devolver que el lugar de la ModelAndView, de modo que el cliente termina recibiendo la versión serializada del objeto contenedor.
  3. 2

    Usted podría ir con este enfoque, es una gran idea y obras, así como la necesidad de excepciones sólo dentro de particular Controlador hace @ExceptionHandler no es tan útil como parece.

Dejar respuesta

Please enter your comment!
Please enter your name here