2011-08-29 30 views
5

Actualmente estoy tratando de usar HandlerExceptionResolver para el manejo de excepciones en un proyecto Spring MVC.Spring MVC manejo de excepciones con HandlerExceptionResolver

Quiero manejar excepciones normales a través de resolveException, así como de 404 a través de handleNoSuchRequestHandlingMethod.

Dependiendo del tipo de solicitud JSON o text/html, la respuesta de excepción debe devolverse adecuadamente.

resolveException funciona ahora.

Pero handleNoSuchRequestHandlingMethod me está dando dolor de cabeza. ¡Nunca se llama!

De acuerdo con la docu el método debe ser llamado en 404 errores

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.html

¿Qué estoy haciendo mal ...

Esto es lo que tengo hasta ahora.

public class JsonExceptionResolver implements HandlerExceptionResolver { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    public ModelAndView resolveException(HttpServletRequest request, 
    if (exception instanceof NoSuchRequestHandlingMethodException) { 
       return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException)    exception, request, response, handler); 
    } 
    ...     
    } 

    public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex, 
     HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler){ 

    logger.info("Handle my exception!!!"); 

    ModelAndView mav = new ModelAndView(); 
    boolean isJSON = request.getHeader("Accept").equals("application/json"); 

    if(isJSON){ 
    ... 

    }else{ 
    .. 
    } 

    return mav; 
    } 

} 

EDITAR con DefaultHandlerExceptionResolver:

public class MyExceptionResolver extends DefaultHandlerExceptionResolver { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    @Override 
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { 
    logger.warn("An Exception has occured in the application", exception); 


    logger.info("exception thrown " + exception.getMessage()); 
    if (exception instanceof NoSuchRequestHandlingMethodException) { 
     return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) exception, request, response, handler); 
    } 

    ... 
    return mav; 
    } 

    public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException ex, 
     HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler){ 

    logger.info("Handle my exception!!!"); 

    ModelAndView mav = new ModelAndView(); 
    boolean isJSON = request.getHeader("Accept").equals("application/json"); 

    if(isJSON){ 

     ... 
    }else{ 
     ... 
    } 

    return mav; 
    } 
} 

El código anterior aún no tiene ningún efecto.

¿Alguna otra idea?

Respuesta

3

De acuerdo con Juergen Hoeller de Spring, no es posible con el HandlerExceptionResolver porque solo funciona para el mapeo secundario, p. Ej.

tiene un controlador asignado a /account/** y accede a un método de una cuenta donde no existe una asignación como /acount/notExists de lo que debería funcionar.

voy a abrir una mejora billete JIRA para esta funcionalidad

EDIT:

billete JIRA sobre este tema

https://jira.springsource.org/browse/SPR-8837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=72648#comment-72648

2

handleNoSuchRequestHandlingMethod no es parte de la interfaz HandlerExceptionResolver, por lo que solo al declarar un método de ese nombre no hará nada. Es un método protegido específico para DefaultHandlerExceptionResolver, y se llama a su método resolveException (que es parte de la interfaz):

if (ex instanceof NoSuchRequestHandlingMethodException) { 
    return handleNoSuchRequestHandlingMethod((NoSuchRequestHandlingMethodException) ex, request, response, handler); 
} 

Para reproducir la misma funcionalidad, puede subclase DefaultHandlerExceptionResolver y anular los métodos que necesita a, o necesita agregar una caja en su método resolveException que maneja NoSuchRequestHandlingMethodException.

+0

He actualizado mi código. ¿Lo dijiste así? –

+1

También lo probé con la herencia de '' DefaultHandlerExceptionResolver'', pero en el caso de un 404, '' doResolveException'' nunca se llama ... ¿te entendí mal? –