通用的 @ExceptionHandler 和 DefaultHandlerExceptionResolver 可以玩得好吗?

Eme*_*gia 5 spring-mvc

我想实现一个@ExceptionHandler可以防止所有未捕获的异常到达客户端。像这样的东西...

@ControllerAdvice
public class ExceptionHandlingControllerAdvice {

    private static final Logger logger = getLogger(ExceptionHandlingControllerAdvice.class);

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = INTERNAL_SERVER_ERROR)
    public void handleAnyUncaughtException(Exception e) {
        logger.error("This uncaught exception is being blocked from reaching the client.", e);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这妨碍了开箱即用的异常处理DefaultHandlerExceptionResolver,例如,在@RequestBody检查失败的验证时抛出 4xx 错误@Valid@ExceptionHandlerDHER可以尝试返回 4xx之前,似乎优先并返回 500 。

有没有办法阻止未捕获的异常到达客户端,但仍然让客户端DefaultHandlerExceptionResolver完成它的工作?

Eme*_*gia 5

我找到了解决方案。我正在编写一个@ExceptionHandler显式处理所有标准 Spring MVC 异常的代码,检查了列表的手册,并遍历了ResponseEntityExceptionHandler基类。

扩展在基类@ControllerAdvice增加了一个@ExceptionHandler与关键区别标准异常,你就不必维护该列表应这些异常变化。在@ControllerAdvice现在看起来是这样。

@ControllerAdvice
public class ExceptionHandlingControllerAdvice extends ResponseEntityExceptionHandler {

    private static final Logger logger = getLogger(ExceptionHandlingControllerAdvice.class);

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = INTERNAL_SERVER_ERROR)
    public void handleAnyUncaughtException(Exception e) {
        logger.error("This uncaught exception is being blocked from reaching the client.", e);
    }
}
Run Code Online (Sandbox Code Playgroud)