programing

스프링 부트 응용 프로그램 시작 중 MethodArgumentNotValidException에 대해 매핑된 모호한 @ExceptionHandler 메서드를 얻는 중

topblog 2023. 3. 4. 14:07
반응형

스프링 부트 응용 프로그램 시작 중 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석입니니다다

이것은, 클래스의 소스로부터 간단하게 확인할 수 있습니다.

https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java

이것이 로그에 다음과 같은 오류가 표시되는 이유입니다.

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

반응형