2013-10-24 3 views
3

Я знаю, что Exception является родителем всех исключений, но я подумал, что когда вы устанавливаете @ExceptionHandler с определенным классом исключений, это должно обрабатывать определенные исключение.Почему @ExceptionHandler (MethodArgumentNotValidException.class) игнорируется в пользу @ExceptionHandler (Exception.class)

Возможно, вы можете указать, что я пропустил в следующем коде, поэтому 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); 
} 
} 
+1

Вы уверены, что 'MethodArgumentNotValidException' выбрано, а не некоторый класс-оболочка? –

+0

@SotiriosDelimanolis, не [ваш ответ] (http://stackoverflow.com/questions/19498378/setting-precedence-of-multiple-controlleradvice-exceptionhandlers/19500823#19500823) помогите здесь? :) –

+1

@ MichałRybak Кажется, что у OP только один класс '@ ControllerAdvice'. –

ответ

1

После правки, ясно, что у вас есть более чем один @ControllerAdvice класс.

Короче говоря, проблема заключается в том, что ваш ExceptionHandler класс (и его @ExceptionHandler для Exception.class) регистрируется сначала весной, а потому, что Exception обработчик соответствует любому исключение, оно будет соответствовать прежде, чем весна никогда не получает более конкретные обработчики определены.

Вы можете прочитать подробное объяснение в @Sotirios ответить here.

Смежные вопросы