2010-04-13 15 views
7

Esperaba implementar un único "ExceptionController" para manejar las excepciones que se ejecutan en la ejecución de los métodos de mis otros controladores. No había especificado ningún HandlerExceptionResolver en el contexto de mi aplicación, así que de acuerdo con el API documentation debería iniciarse AnnotationMethodHandlerExceptionResolver. Lo verifiqué como tal en la fuente. Entonces, ¿por qué no funciona lo siguiente?Problemas de implementación del controlador de excepción de Spring 3

@Controller 
public class ExceptionController { 

    @ExceptionHandler(NullPointerException.class) 
    public ModelAndView handleNullPointerException(NullPointerException ex) { 
    // Do some stuff 
    log.error(logging stuff) 
    return myModelAndView; 
    } 
} 

@Controller 
public class AnotherController { 

    @RequestMapping(value="/nullpointerpath") 
    public String throwNullPointer() { 
    throw new NullPointerException(); 
    } 
} 

que veo en los registros de depuración que los tres controladores de excepciones por defecto se les pide para el manejo de la excepción, pero no se hace nada y veo "DispatcherServlet - No se pudo completar la solicitud". Seguido por el usuario que se muestra stacktrace y un error interno de 500.

Respuesta

6

Asegúrate de que tu controlador de excepción devuelve una vista que existe/se asigna a un controlador.

+0

Ese parecía ser el problema. – predhme

+2

@predhme, ¿eso realmente solucionó tu problema? Tengo un ejemplo como el tuyo, y el método @ExceptionHandler solo se invoca cuando se lanza la excepción desde el mismo controlador. – curthipster

+1

Lo noté más adelante también. Supongo que lo más importante fue configurar las páginas 500 y 404 para que, si hubiera algo que no captara, al usuario no se le presentara un seguimiento de la pila. – predhme

1

No creo que este sea un buen diseño. Los controladores de Spring manejan las solicitudes HTTP y asignan URL. No creo que la "excepción" encaje en ninguno de los contenedores. Se siente como un mal uso de Spring para mí.

La excepción no es una solicitud HTTP. No asigna una excepción a una URL. Por lo tanto, concluiría que los controladores no están destinados a ser tratados como manejadores de excepciones.

Los controladores son y forman parte de Spring API, pero su diseño no los está usando como corresponde, por eso no funciona. Repensa tu diseño.

+1

Es parte de la API de primavera. No estoy seguro de entender por qué sería mal uso entonces. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers – predhme

4

Debe escribir su manejador de excepciones en la misma clase con la que desea manejar, como la siguiente.

@Controller 
public class AnotherController { 
    @ExceptionHandler(NullPointerException.class) 
    public ModelAndView handleNullPointerException(NullPointerException ex) { 
     // Do some stuff. 
     log.error(logging stuff) 
     return myModelAndView; 
    } 

    @RequestMapping(value="/nullpointerpath") 
    public String throwNullPointer() { 
     throw new NullPointerException(); 
    } 
} 
Cuestiones relacionadas