我知道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);
}
}
答案 0 :(得分:1)
编辑后,很明显您有多个@ControllerAdvice
课程。
简而言之,问题是您的ExceptionHandler
类(及其@ExceptionHandler
Exception.class
)首先由Spring注册,并且因为Exception
处理程序匹配任何异常,它将在Spring进入更具体的处理程序之前进行匹配。
您可以在@Sotirios回答here中阅读详细说明。
答案 1 :(得分:1)
我建议您仅注册一个ControllerAdvice
并确保其扩展ResponseEntityExceptionHandler
,以便不会覆盖MethodArgumentNotValidException
的默认处理。
如果您随后希望更改处理MethodArumentNotValidException
的逻辑,则可以覆盖handleMethodArgumentNotValid
方法。