Spring异常处理程序记录所有异常但返回原始响应

时间:2016-05-20 06:39:38

标签: spring spring-boot

所以我试图以通用的方式记录spring项目的控制器返回的所有未捕获的异常。 我能够使用以下异常处理程序执行此操作:

@ControllerAdvice
public class ControllerConfig {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

public static final String DEFAULT_ERROR_VIEW = "error";

@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleBadRequest(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
    throw e;
}

@ExceptionHandler(AccessDeniedException.class)
public void defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception {
    logger.error("Error in request:" + request.getRequestURL(), e);
    throw e;
}

这也会返回请求的错误响应,因此我不必区分所有不同的错误响应代码。

但是,对于方法的每次调用,都会创建第二个错误日志,因为方法中抛出了异常: 代码来自org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#doResolveHandlerMethodException

try {
        if (logger.isDebugEnabled()) {
            logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod);
        }
        exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception);
    }
    catch (Exception invocationEx) {
        if (logger.isErrorEnabled()) {
            logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx);
        }
        return null;
    }

那么有更聪明的方法可以返回方法的原始异常吗?

1 个答案:

答案 0 :(得分:1)

这取决于你的意思"一种更聪明的方式来恢复原来的例外"。您想要什么回到客户端?如果这只是异常的消息,您只需从异常处理程序返回它,并使用@ResponseBody注释该方法。春天会为你做剩下的事。

@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String handleBadRequest(HttpMessageNotReadableException e) {
    logger.warn("Returning HTTP 400 Bad Request", e);
    throw e.getMessage();
}

您还可以返回一些自定义对象,它包装了异常信息和您想要的任何其他数据。