@ControllerAdvice异常处理与@ResponseStatus一起
我有@ControllerAdvice
类,它处理一组异常。 比我们还有其他一些例外,它们用@ResponseStatus
注解来标注。 为了结合这两种方法,我们使用博客文章中描述的技术:http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc,即在ControllerAdvice
我们处理下面的通用Exception
办法:
@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;
}
它像一个魅力,但是,使用这种技术导致错误,以下文本出现在应用程序日志中:
2014-06-11 15:51:32.907 ERROR o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...
这是由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;
}
有谁知道如何正确地将这两种方法结合起来以避免日志中的错误?
谢谢,Jan
当我错过了这种imprort
时,我也遇到了同样的问题:
import org.springframework.http.HttpStatus;
Eclipse没有提供我在Quick Fix中添加它,我手动添加了该行并且它有所帮助。
我以一种稍微不同的方式处理了它,我认为这解决了您的问题。
因为我知道基本上我想处理404的不同于任何色相的500s,所以我寻找NOT_FOUND状态并相应地发送,这似乎起作用,然后你不会重新抛出异常。
意即
@ControllerAdvice
public class MVCExceptionHandler {
private static final Logger log = LogManager.getLogger();
@ExceptionHandler(Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, HttpServletResponse res, Exception ex) throws Exception {
// If the exception is annotated with @ResponseStatus check if it's a 404 in which case deal with it, otherwise 500 it.
if (AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class) != null) {
ResponseStatus rs = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class);
if (HttpStatus.NOT_FOUND.equals(rs.value())) {
res.setStatus(HttpStatus.NOT_FOUND.value());
return new ModelAndView("error/404");
}
}
log.error("Error while loading", ex);
return new ModelAndView("error/500");
}
}
这是一个老问题,但我今天刚刚遇到了这个问题,并且发现了一个比禁用ExceptionHandlerExceptionResolver
日志更好的解决方案。 事实证明,这个问题可以通过升级到最新版本的spring框架(4.3.8为我工作)来解决。 ExceptionHandlerExceptionResolver
已被修复,以检测是否从@ExceptionHandler
了原始异常。 在这种情况下,异常不再被记录。
上一篇: @ControllerAdvice exception handling together with @ResponseStatus
下一篇: Putting Resharper's ignored errors under version control