2023. 1. 17. 00:04ㆍ프로젝트/[Sleeper] 수면관리 어플리케이션
프로젝트를 하던 중 예외처리를 하던 중 아래와 같은 에러가 발생했다ㅠㅠ
문제 발생
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);
}
감사합니다~
'프로젝트 > [Sleeper] 수면관리 어플리케이션' 카테고리의 다른 글
NoResultException : No entity found for query 에러 해결 (0) | 2023.01.18 |
---|---|
에러 해결을 통해 공부하는 지연로딩과 프록시 (0) | 2023.01.18 |
JdbcSQLIntegrityConstraintViolationException - @GeneratedValue의 GenerationType (0) | 2023.01.06 |
URL 작성의 어려움 - HATEOAS (0) | 2023.01.01 |
날짜 시간 데이터 요청/응답 - ZonedDateTime (0) | 2022.12.29 |