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

时间:2013-10-24 13:34:07

标签: java spring spring-mvc exception-handling

我知道Exception是所有异常的Parent,但我想当你用特定的异常类设置@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);
}
}

2 个答案:

答案 0 :(得分:1)

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

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

您可以在@Sotirios回答here中阅读详细说明。

答案 1 :(得分:1)

我建议您仅注册一个ControllerAdvice并确保其扩展ResponseEntityExceptionHandler,以便不会覆盖MethodArgumentNotValidException的默认处理。

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