为什么 @ExceptionHandler(MethodArgumentNotValidException.class) 被忽略而支持 @ExceptionHandler(Exception.class)

use*_*282 6 java spring exception-handling spring-mvc

我知道 Exception 是所有异常的父级,但我认为当您使用特定异常类设置 @ExceptionHandler 时,这应该处理该特定异常。

也许您可以指出我在以下代码中遗漏的内容,因此 MethodArgumentNotValidException 将进入 processValidationError 方法而不是 processError 方法。

@ControllerAdvice
public class ExceptionHandler {

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public ValidationErrorDTO processError(Exception e) {
    return processErrors(e);
  }
 }

  @ControllerAdvice
public class OtherExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ValidationErrorDTO processValidationError(MethodArgumentNotValidException ex) {
    return processErrors(ex);
}
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*bak 0

编辑后,很明显您有多个@ControllerAdvice类。

简而言之,问题在于您的ExceptionHandler类(及其@ExceptionHandlerfor Exception.class)首先由 Spring 注册,并且由于Exception处理程序匹配任何异常,因此它将在 Spring 定义更具体的处理程序之前进行匹配。

您可以在此处阅读@Sotirios 答案中的详细说明。