2011-08-29 25 views
5

Attualmente sto cercando di utilizzare HandlerExceptionResolver per la gestione delle eccezioni in un progetto Spring MVC.Spring MVC gestione delle eccezioni con HandlerExceptionResolver

Desidero gestire le normali eccezioni tramite resolveException e 404 tramite handleNoSuchRequestHandlingMethod.

A seconda del tipo di richiesta JSON o text/html, la risposta dell'eccezione deve essere restituita in modo appropriato.

resolveException funziona ora.

Ma il handleNoSuchRequestHandlingMethod mi sta facendo venire il mal di testa. Non è mai stato chiamato!

Secondo il docu il metodo dovrebbe essere chiamato il 404 errori

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

Che cosa sto facendo di sbagliato ...

Questo è quello che ho finora.

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; 
    } 

} 

EDIT 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; 
    } 
} 

Il codice di cui sopra non ha ancora alcun effetto.

Altre idee?

risposta

3

Secondo Juergen Hoeller della primavera, non è possibile con lo HandlerExceptionResolver perché funziona solo per la sottoraviglianza, ad es.

si dispone di un controller mappato su /account/** e accede a un metodo da acount in cui non esiste alcuna mappatura come /acount/notExists di quanto dovrebbe funzionare.

aprirò un JIRA miglioramento biglietto per questa funzionalità

EDIT:

biglietto JIRA su questo problema

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

2

handleNoSuchRequestHandlingMethod non fa parte dell'interfaccia HandlerExceptionResolver, quindi solo dichiarare un metodo con quel nome non farà nulla. E 'un metodo protetto specifico per DefaultHandlerExceptionResolver, e viene chiamato dal suo metodo resolveException (che è parte dell'interfaccia):

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

Per riprodurre le stesse funzionalità, è possibile sottoclasse DefaultHandlerExceptionResolver e sovrascrivere i metodi necessari a, o è necessario aggiungere un caso nel tuo metodo resolveException che gestisce NoSuchRequestHandlingMethodException.

+0

ho aggiornato il mio codice. Intendevi in ​​questo modo? –

+1

L'ho provato anche ereditando da '' DefaultHandlerExceptionResolver'', ma in caso di un 404 il '' doResolveException'' non viene mai chiamato ... ti ho dimenticato? –

Problemi correlati