spring boot 3.0 이후 handleMethodArgumentNotValid 메소드
1038
작성한 질문수 24
안녕하세요 강사님
좋은 강의 감사드립니다.
스프링부트 3.0 이후부터는 오버라이딩한 handleMethodArgumentNotValid 메소드를 타지 않아 강의에서처럼 동작을 하지 않습니다.
다음과 같이 코드를 짜도 에러가 나면서 서버가 죽어버리는데 어떻게 해야 되나요?
@ExceptionHandler(BindException.class)
public final ResponseEntity<Object> handleMethodArgumentNotValidException(BindException ex) {
ExceptionResponse exceptionResponse = new ExceptionResponse(LocalDateTime.now(), ex.getMessage()
, ex.getBindingResult().toString()); // 클라이언트에게 상세정보 안보여주도록 false
return new ResponseEntity<>(exceptionResponse, HttpStatus.NOT_FOUND);
}에러 내용
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception with message: Ambiguous @ExceptionHandler method mapped for [class org.springframework.validation.BindException]: {public final org.springframework.http.ResponseEntity com.example.myrestfulservice.exception.CustomizedResponseEntityExceptionHandler.handleMethodArgumentNotValidException(org.springframework.validation.BindException), 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}
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177) ~[spring-beans-6.1.5.jar:6.1.5]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644) ~[spring-beans-6.1.5.jar:6.1.5]
... 24 common frames omitted
Caused by: java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.validation.BindException]: {public final org.springframework.http.ResponseEntity com.example.myrestfulservice.exception.CustomizedResponseEntityExceptionHandler.handleMethodArgumentNotValidException(org.springframework.validation.BindException), 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}
at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.addExceptionMapping(ExceptionHandlerMethodResolver.java:114) ~[spring-web-6.1.5.jar:6.1.5]
at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.<init>(ExceptionHandlerMethodResolver.java:78) ~[spring-web-6.1.5.jar:6.1.5]
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.initExceptionHandlerAdviceCache(ExceptionHandlerExceptionResolver.java:289) ~[spring-webmvc-6.1.5.jar:6.1.5]
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.afterPropertiesSet(ExceptionHandlerExceptionResolver.java:256) ~[spring-webmvc-6.1.5.jar:6.1.5]
at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addDefaultHandlerExceptionResolvers(WebMvcConfigurationSupport.java:1063) ~[spring-webmvc-6.1.5.jar:6.1.5]
at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.handlerExceptionResolver(WebMvcConfigurationSupport.java:1005) ~[spring-webmvc-6.1.5.jar:6.1.5]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.5.jar:6.1.5]
... 25 common frames omitted
답변 2
0
안녕하세요, 이도원입니다.
작업하신 내용을 보면, handleMethodArgumentNotValidException 메소드에서 처리하려고 하는 예외가 BindException인데, ResponseEntityExceptionHandler 클래스에 이미 handleMethodAtgumentNotvalid 메소드의 인자로 사용되는 MethodArgumentNotValidException 가 이미 BindException을 상속 받아 구현되었기 때문에, 동일 한 두개의 핸들러가 존재하지 못한는 오류 인 것 같습니다.
아래와 같은 코드 형태라고 하면, 구현하신 handleMethodArgumentNotValidException 메소드는 삭제하시고, handleMethodAtgumentNotvalid 메소드를 재정의해서 BindException을 처리하게 해 보시면 될 것 같습니다.
@ExceptionHandler(BindException.class)
public final ResponseEntity<Object> handleMethodArgumentNotValidException(BindException ex) {
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage()
, ex.getBindingResult().toString()); // 클라이언트에게 상세정보 안보여주도록 false
return new ResponseEntity<>(exceptionResponse, HttpStatus.NOT_FOUND);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatusCode status,
WebRequest request) {
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
"Validation Failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
chaelynjang님의 질문에 대해 답변드립니다.
스프링 부트 버전 3.0 이후 handleMethodArgumentNotValid 메소드의 오버라이딩이 안 되는 문제와 관련하여, 일반적으로 이 메소드는 @Valid 또는 @Validated 어노테이션이 적용된 메소드 파라미터(예: 모델 객체)의 유효성 검증에서 문제가 발견됐을 때 호출됩니다. 이를 오버라이딩하여 사용자 정의 예외 처리를 구현하는 경우입니다.
스프링 3.0 이후 에러 메시지에 따르면 Ambiguous @ExceptionHandler method mapped for [class org.springframework.validation.BindException] 즉, BindException에 대해 매핑된 @ExceptionHandler 메소드가 모호하다는 에러가 발생합니다. 여기서 문제는, 스프링이 두 메소드(handleMethodArgumentNotValidException 및 ResponseEntityExceptionHandler의 handleException)를 BindException 처리용으로 인식하고 이 중 어떤 것을 사용해야 할지 결정하지 못하는 것입니다.
해결 방법으로는, @ExceptionHandler가 명시된 사용자 정의 메소드의 예외 타입을 더 구체적으로 변경하거나, 스프링의 기본 예외 처리 메커니즘을 사용하는 대신 완전히 사용자 정의 예외 처리 방식을 구현하는 것을 고려할 수 있습니다.
해당 문제 해결을 위해 추가적인 관련 정보는 제공된 내용에 포함되어 있지 않아 구체적인 코드 수정 방법을 제시하기는 어렵습니다. 하지만, 일반적으로는 @ControllerAdvice를 사용하여 애플리케이션 전반에 걸친 예외 처리를 사용자 정의하는 방식을 채택할 수 있습니다. 예를 들어, 다양한 예외에 대한 처리를 한 곳에서 관리하고, 필요에 따라 HTTP 상태 코드, 에러 메시지 등을 조정하는 방식입니다.
JPA
0
57
1
jpa dependency를 추가하고 SecurityConfig클래스에서 오류가 납니다.
0
68
1
웹 브라우저 400 bad request
0
70
1
@Size는 되는데 @Past는 안 됩니다.
0
61
1
pdf 자료는 없나요?
0
73
2
locale 정보가 null 이면 무조건 messages_ko.properties이 호출 되는 문제
0
87
2
Swagger 강의, Unable to infer base url 이거 뜨시는 분들 도움되시라고
0
118
1
강의에서나온 화면 피피티
0
158
1
HelloWorldBean 관련 에러
0
183
2
Swagger API 3.x 오류..
0
219
1
java: variable message not initialized in the default constructor 에러는 어찌하면 좋을까요?
1
282
1
현재 GIT에 올리신 소스를 실행해봤습니다.
0
189
2
고양이 소리가 귀엽네요 !!
0
137
2
git에서 소스받고 실습중인데
0
117
1
post가 안되요
0
102
1
한국어 같은 경우 언어코드인 messages_ko.properties 로 생성하는게 더 좋지 않나요?
0
167
2
리턴타입으로서 EntityModel<User> 와 ResponseEntity질문
0
103
1
예외처리쪽 관련 질문있습니다.
0
159
2
엔티티가 바로 응답으로 나가도 되나요??
0
221
2
안녕하세여 Cannot invoke "co.kr.joneconsulting.resfulservice.repository.PostRepository.save(Object)" because "this.postRepository" is null
0
135
2
사용자 등록하고 나서 H2 에서 보면 신규 사용자의 password, ssn 이 null 로 되어 있습니다.
0
140
2
ApplictionContext 질문
0
191
2
롬북이 안먹히는것같아요
0
156
1
인텔리제이에서스프링부트 파일 실행하면
0
239
1





