@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了原始异常。 在这种情况下,异常不再被记录。

链接地址: http://www.djcxy.com/p/20945.html

上一篇: @ControllerAdvice exception handling together with @ResponseStatus

下一篇: Putting Resharper's ignored errors under version control