본문 바로가기
Project Trouble Shooting/[Sleeper] 수면관리 어플리케이션

Error creating bean with name 'handlerExceptionResolver'

by Big Sun 2023. 1. 17.
728x90

프로젝트를 하던 중 예외처리를 하던 중 아래와 같은 에러가 발생했다ㅠㅠ

 

문제 발생

 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'handlerExceptionResolver' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception;
nested exception is java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]:
{public org.springframework.http.ResponseEntity econo.app.sleeper.exception.GlobalExceptionHandler.handleMethodArgumentNotValid(org.springframework.web.bind.MethodArgumentNotValidException),
public final org.springframework.http.ResponseEntity org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest) throws java.lang.Exception}

에러코드를 읽어보면, handlerExceptionResolver 빈을 만들지 못했다는 것을 알 수 있다.

또한, MethodArgumentNotValidException에 매핑된 @ExceptionHandler가 모호하다 라고 말하고 있다.

 

 

현재 상황

 

아래와 같은 ExceptionHandler를 만들어, @RestControllerAdvice를 통해 스프링에 빈으로 등록해준 상황이고,

@ExceptionHandler를 통해 MethodArgumentNotValidException.class 라는 예외를 처리해줄 예정이다.

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException e) {
    ErrorCode errorCode = CommonErrorCode.INVALID_PARAMETER;
    return handleExceptionInternal(errorCode);
}

...
}

 

MethodArgumentNotValidException은 컨트롤러에서 요청을 받을 때, @Valid 어노테이션을 사용해서 요청을으로 받은

application/json 데이터가 유효하지 않을 때 발생하는 예외이다.

 

문제 분석

현재 GlobalExceptionHandler는 ResponseEntityExceptionHandler를 상속받고 있습니다.

 

그리고 ResponseEntityExceptionHandler는 아래와 같은 메서드들이 구현되어 있습니다

 

그림을 보면, handleMethodArgumentNotValid라는 메서드가 구현되어 있는 것을 볼 수 있습니다.

따라서, GlobalExceptionHandler에서 동일한 예외처리를 하게 되면 Ambigous(모호성)문제가 발생합니다.

 

 

문제 해결

 

따라서, handleMethodArgumentNotValid의 오버라이딩 한 메서드를 아래와 같이 커스터마이징 해줘

문제를 해결하였습니다.

 

@Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers,
                                                                  HttpStatus status,
                                                                  WebRequest request) {
        ErrorCode errorCode = CommonErrorCode.INVALID_PARAMETER;
        return handleExceptionInternal(errorCode);
    }

 

 

java - Getting Ambiguous @ExceptionHandler method mapped for MethodArgumentNotValidException while startup of spring boot application - Stack Overflow

 

Getting Ambiguous @ExceptionHandler method mapped for MethodArgumentNotValidException while startup of spring boot application

I have written custom exception handler class for one of my spring controllers to validate if email attribute from request param is in the proper format. So created a new class which extends

stackoverflow.com

 

 

감사합니다~

728x90