6

Exception がすべての例外の親であることは知っていますが、 @ExceptionHandler を特定の例外クラスで設定すると、その特定の例外を処理する必要があると思いました。

たぶん、次のコードで私が見逃したものを指摘できるので、MethodArgumentNotValidException は processError メソッドではなく processValidationError メソッドに入ります。

@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 answer hereで詳細な説明を読むことができます。

于 2013-10-24T21:37:35.233 に答える