6

我知道 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);
}
}
4

2 回答 2

1

编辑后,很明显你有不止一@ControllerAdvice门课。

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

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

于 2013-10-24T21:37:35.233 回答
1

我建议你只注册一个ControllerAdvice并确保它 extends ResponseEntityExceptionHandler,所以默认处理MethodArgumentNotValidException不会被覆盖。

如果您希望更改处理 的逻辑MethodArumentNotValidException,您可以覆盖该handleMethodArgumentNotValid方法。

于 2020-06-18T09:39:49.093 回答