Spring中自定义@ControllerAdvice用于异常处理

ior*_*vic 6 java rest spring exception spring-restcontroller

我试图将异常从我的休息控制器映射到具有主体的响应,并在中心位置执行此操作。

我已经尝试过这个:

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class RestErrorResponseExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(
        Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        super.handleExceptionInternal(ex, body, headers, status, request);

        return ResponseEntity.status(status).body(Error.from(status));
    }
} 
Run Code Online (Sandbox Code Playgroud)

问题是处理程序永远不会被触发。

@ExceptionHandler如果我在其余控制器中定义一个自定义方法,或者扩展具有 的东西@ExceptionHandler,那么一切都会很好,但这会引入一些糟糕的设计。

据我了解,Spring 将首先尝试在控制器中查找异常处理方法,然后检查已注册的处理程序。

我试图通过 WebMvcTest 验证行为,并且我得到的响应不是我期望的 Error 对象。

我有什么遗漏的吗?

小智 6

ControllerAdvice是一个必须由Spring注册的配置。您必须将您的类移动到配置包中,或者您可以通过注释注册它。

就我而言,我使用像这样的controllerAdvice:

@ControllerAdvice
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(MyException.class) 
    public ResponseEntity<String> reponseMyException(Exception e) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("my message");
    }
}
Run Code Online (Sandbox Code Playgroud)