2013-10-24 1 views
3

예외가 모든 예외의 부모임을 알고 있지만 특정 예외 클래스를 사용하여 @ExceptionHandler를 설정하면 해당 예외를 처리해야한다고 생각했습니다. 예외.@ExceptionHandler (MethodArgumentNotValidException.class)가 @ExceptionHandler (Exception.class)를 위해 무시되는 이유

아마도 다음 코드에서 놓친 것을 지적 할 수 있습니다. 따라서 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); 
} 
} 
+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 클래스 (및 Exception.class에 대한 @ExceptionHandler)가 스프링에 의해 처음으로 등록됩니다 것을, 그리고 Exception 핸들러가 예외를 일치하기 때문에 봄이 점점 더 특정 핸들러 정의하기지기 전에, 그것은 일치됩니다.

@Sotirios 대답 here에서 자세한 설명을 읽을 수 있습니다.

관련 문제