Spring Boot Rest API @Valid @ExceptionHandler 仅在 RestController 内工作

Kri*_*ish 5 spring-mvc hibernate-validator spring-validator spring-boot

我想在 Spring Rest api 的控制器级别验证实体。这是我的代码:

@RestController
@RequestMapping("/orgs")
public class OrganizationController {
    @PostMapping("/")
    public ResponseEntity<ValidationResponse> addOrganization(@Valid @RequestBody Organization organization){
        //code here
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ValidationResponse> invalidInput(MethodArgumentNotValidException ex) {        
        ValidationResponse response = new ValidationResponse();
        response.setSuccess(false);
        response.setMessage(ex.getMessage());

        return new ResponseEntity<ValidationResponse>(response, HttpStatus.BAD_REQUEST);
    }

}
Run Code Online (Sandbox Code Playgroud)

如果我在控制器类中包含 ExceptionHandler ,它就可以正常工作。但是,如果我将这个异常处理程序移动到 @ControllerAdvice 中,如下所示,它不起作用。

@ControllerAdvice
public class ExceptionHandlingController {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ValidationResponse> invalidInput(MethodArgumentNotValidException ex) {
        ValidationResponse response = new ValidationResponse();
        response.setSuccess(false);
        response.setMessage(ex.getMessage());
        return new ResponseEntity<ValidationResponse>(response, HttpStatus.BAD_REQUEST);
    }
}
Run Code Online (Sandbox Code Playgroud)

从控制台日志我发现它被扫描了:

ExceptionHandlerExceptionResolver - Detected @ExceptionHandler methods in defaultExceptionHandler
ExceptionHandlerExceptionResolver - Detected @ExceptionHandler methods in exceptionHandlingController
Run Code Online (Sandbox Code Playgroud)

但 ExceptionHandler 方法没有被调用。

难道我做错了什么吗?

小智 0

尝试使用@ExceptionHandler(value = BindException.class)