In meinem Test verwenden SimpleMappingExceptionResolver
nicht MissingServletRequestParameterException
anmelden können, ich kombiniert @ControllerAdvice
und Filter
melden Sie sich zu tun.
Verwenden Sie ControllerAdvice
, um Throwable im Frühjahr angehoben MVC Controller zu fangen.
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger("global_controller_exception_logger");
@ExceptionHandler(value = Throwable.class)
public void defaultErrorHandler(Throwable e) throws Throwable {
// If the exception is annotated with @ResponseStatus rethrow it and let
// the framework handle it.
// AnnotationUtils is a Spring Framework utility class.
if (AnnotationUtils.findAnnotation
(e.getClass(), ResponseStatus.class) != null) {
throw e;
}
// Otherwise log exception
logger.error("global controller default exception handler", e);
throw e;
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public void httpBadRequest(Exception e, HttpServletRequest request) throws Exception {
StringBuffer requestURL = request.getRequestURL();
logger.warn("{} HTTP Status 400 - {}", requestURL, e.getMessage());
throw e;
}
}
Verwenden Filter
weitere Ausnahme zu fangen.
@WebFilter(
filterName = "ExceptionLogFilter",
urlPatterns = "/*",
dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR}
)
public class ExceptionLogFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger("global_filter_exception_logger");
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(request, response);
} catch (IOException | ServletException e) {
logger.error("bad thing happened during doFilter", e);
throw e;
}
}
......
}
logback Konfiguration
<logger name="global_controller_exception_logger" level="info"/>
<logger name="global_filter_exception_logger" level="info"/>
Sie können my gist für vollständigen Code anzeigen.
Also, welche Ausnahmen werden mit dieser Methode verpasst, und gibt es eine Möglichkeit, diese zu bekommen? –
Guter Punkt. Ich habe Spring seit langer Zeit nicht mehr benutzt und kann mich nicht erinnern. Ich hätte ein bisschen mehr Info oben enthalten sollen. Meine beste Vermutung an dieser Stelle sind Ausnahmen, die von 'RuntimeException' abgeleitet sind, wie ich oben angedeutet habe. –