스프링 부트 응용 프로그램 시작 중 MethodArgumentNotValidException에 대해 매핑된 모호한 @ExceptionHandler 메서드를 얻는 중
요청 파라미터의 이메일 속성이 올바른 형식인지 확인하기 위해 스프링 컨트롤러 중 하나에 대해 커스텀 예외 핸들러 클래스를 작성했습니다.그래서 새로운 클래스를 만들었습니다.ResponseEntityExceptionHandler
수업과 함께 메서드를 작성했습니다.@ExceptionHandler
.
그러나 스프링 부트 어플리케이션의 기동중에, 프로젝트의 실행을 정지하는 예외 이하가 됩니다.누가 이 문제를 해결하는 것을 도와줄 수 있나요?
서버 시작 중 예외 발생:
org. springframework.콩류.빈크리에이션예외:클래스 경로 리소스 [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]에 정의된 이름이 'handlerExceptionResolver'인 콩을 만드는 동안 오류가 발생했습니다.공장 메서드를 통한 콩 인스턴스화에 실패했습니다.
중첩된 예외는 org.springframework입니다.bean.Bean Instantation예외:[org.springframework]를 인스턴스화하지 못했습니다.web.servlet.Handler Exception Resolver ] :공장 메서드 'handlerExceptionResolver'에서 예외가 발생했습니다.
nested 예외는 java.display입니다.InlawalStateException:[ class org . springframework . web . bind ]에 매핑된 애매한 @ExceptionHandler 메서드.MethodArgumentNotValidException]:{public com.TestVO com.handler.exception.TestExceptionHandler.methodArgumentNotValidException(또는 스프링프레임워크.web.bind).MethodArgumentNotValidException), 퍼블릭 최종 org.springframework.http.ResponseEntity org.springframework.web.servlet.mvc.disc.interation.disc.interation.Response EntityExceptionHandler.handleException(java.lang).예외, 예를 들어 스프링프레임워크.web.disc.request를 참조해 주세요.WebRequest)는 java.lang을 슬로우합니다.예외}
처리할 커스텀 클래스MethodArgumentNotValidException
:
@ControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorVO processValidationError(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
List<FieldError> fieldErrors = result.getFieldErrors();
FieldError fieldError = fieldErrors.get(0);
ErrorVO dto = new ErrorVO(fieldError.getDefaultMessage());
return dto;
}
}
애매한 것은 양쪽 클래스의 메서드가 같기 때문입니다.@ExceptionHandler - ResponseEntityExceptionHandler, MethodArgumentNotValidException.이 문제를 해결하려면 재정의된 방법을 다음과 같이 작성해야 합니다.
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
String errorMessage = ex.getBindingResult().getFieldErrors().get(0).getDefaultMessage();
List<String> validationList = ex.getBindingResult().getFieldErrors().stream().map(fieldError->fieldError.getDefaultMessage()).collect(Collectors.toList());
LOGGER.info("Validation error list : "+validationList);
ApiErrorVO apiErrorVO = new ApiErrorVO(errorMessage);
apiErrorVO.setErrorList(validationList);
return new ResponseEntity<>(apiErrorVO, status);
}
여기서 겪는 문제는 예상대로입니다.봄을 효과적으로 연장하고 있습니다.ResponseEntityExceptionHandler
디폴트로는 이미 선언이 포함되어 있습니다.MethodArgumentNotValidException
@ExceptionHandler
석입니니다다
이것은, 클래스의 소스로부터 간단하게 확인할 수 있습니다.
이것이 로그에 다음과 같은 오류가 표시되는 이유입니다.
java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]
위의 모든 내용에 따라 독자적인 예외 핸들러 메서드를 삭제하고 이 메서드에서 오버라이드해야 합니다.
이 감돌다ResponseEntityExceptionHandler
★★★★★★에MethodArgumentNotValidException
따라서 동일한 예외에 대해 2개의 핸들러를 사용할 수 없습니다.
해서 다시 한 번 를 해보시면 됩니다.ResponseEntityExceptionHandler.handleMethodArgumentNotValid()
.
나는 이 문제에 대한 해결책을 찾았다!
@ControllerAdvice 주석을 @RestControllerAdvice for Rest 컨트롤러로 변경했습니다.
스프링 부트 및 ControllerAdvice 구조에는 이미 MethodArgumentNotValidException이 포함되어 있습니다.다음으로 methodArgumentNotValidExtection 함수는 intellij idea / 또는 다른 ide를 통해 덮어쓰기 메서드를 호출함으로써 기본적으로 제공됩니다.
정상적으로 동작했습니다. :) 도움이 되길 바랍니다. :)
예
@Override
@ResponseStatus
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
for (ObjectError methodArgumentNotValidException : ex.getBindingResult().getAllErrors()){
localerrorEntitiesList.add(new ErrorEntity(methodArgumentNotValidException.getDefaultMessage(),methodArgumentNotValidException.getCode()));
}
try {
return new ResponseEntity<>(new ErrorResponse(localerrorEntitiesList),HttpStatus.BAD_REQUEST);
}catch (Exception e){
return new ResponseEntity<>(new ErrorResponse(localerrorEntitiesList),HttpStatus.BAD_REQUEST);
}
}
언급URL : https://stackoverflow.com/questions/51991992/getting-ambiguous-exceptionhandler-method-mapped-for-methodargumentnotvalidexce
'programing' 카테고리의 다른 글
의존성 주입 용기의 이점은 무엇입니까? (0) | 2023.03.04 |
---|---|
스프링 부트 핫 스왑 (0) | 2023.03.04 |
문자열 변수를 파일이 아닌 jq로 전달해도 될까요? (0) | 2023.03.04 |
각도 UI-라우터 다중 보기 (0) | 2023.03.04 |
스타일 컴포넌트 대 SCSS(SCSS) 이하 (0) | 2023.03.04 |