Ho classe @ControllerAdvice
, che gestisce un insieme di eccezioni. Rispetto ad altre eccezioni, annotate con annotazione @ResponseStatus
. Per combinare entrambi gli approcci, usiamo la tecnica descritta nel post del blog: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc, vale a dire nel ControllerAdvice
gestiamo generica Exception
nel seguente modo:Gestione delle eccezioni @ControllerAdvice con @ResponseStatus
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
// If the exception is annotated with @ResponseStatus rethrow it and let
// the framework handle it - like the OrderNotFoundException example
// at the start of this post.
// AnnotationUtils is a Spring Framework utility class.
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
throw e;
// Otherwise setup and send the user to a default error-view.
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
Funziona come un fascino, tuttavia, utilizzando questa tecnica causa l'errore con la seguente testo da visualizzare nel registro dell'applicazione:
2014-06-11 15:51:32.907 ERROR o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...
questo è causato da questo pezzo di codice in ExceptionHandlerExceptionResolver
:
try {
if (logger.isDebugEnabled()) {
logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod);
}
exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception);
}
catch (Exception invocationEx) {
logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx);
return null;
}
qualcuno k ora come combinare correttamente questi due approcci alla gestione delle eccezioni per evitare l'errore nel registro?
Grazie, Jan
Non è sufficiente disabilitare la registrazione per 'org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver' risolvere il problema? –
Ci ho pensato, ma non sembrava una soluzione concettuale del problema ... –
In quale altro modo lo aggiusteresti senza reimplementare la classe e rimuovere la riga di log?Perché dovremmo trovare una soluzione complessa quando può essere semplice come disabilitare la registrazione. A seconda del framework di registrazione, è anche possibile creare un filtro che filtri i messaggi in base al pattern. –