카테고리 없음

Spring Boot 응용 프로그램을 시작하는 동안 MethodArgumentNotValidException에 매핑 된 모호한 @ExceptionHandler 메서드 가져 오기

기록만이살길 2021. 2. 20. 00:47
반응형

Spring Boot 응용 프로그램을 시작하는 동안 MethodArgumentNotValidException에 매핑 된 모호한 @ExceptionHandler 메서드 가져 오기

1. 질문(문제점):

요청 매개 변수의 이메일 속성이 올바른 형식인지 확인하기 위해 스프링 컨트롤러 중 하나에 대한 사용자 지정 예외 처리기 클래스를 작성했습니다. 그래서 클래스를 확장 ResponseEntityExceptionHandler하고 @ExceptionHandler.

그러나 봄 부팅 응용 프로그램 시작 중에 내 프로젝트 실행을 중지하는 예외가 발생합니다. 누군가가 이것을 해결하도록 도와 줄 수 있습니까?

서버 시작 중 예외 :

org.springframework.beans.factory.BeanCreationException : 클래스 경로 리소스 [org / springframework / boot / autoconfigure / web / servlet / WebMvcAutoConfiguration $ EnableWebMvcConfiguration.class]에 정의 된 이름이 'handlerExceptionResolver'인 Bean 생성 오류 : 팩토리 메소드를 통한 Bean 인스턴스화 실패;
중첩 된 예외는 org.springframework.beans.BeanInstantiationException : 인스턴스화 실패 [org.springframework.web.servlet.HandlerExceptionResolver] : 팩토리 메소드 'handlerExceptionResolver'에서 예외가 발생했습니다.
중첩 된 예외는 java.lang.IllegalStateException : [class org.springframework.web.bind.MethodArgumentNotValidException]에 매핑 된 모호한 @ExceptionHandler 메소드 : {public com.TestVO com.handler.exception.TestExceptionHandler.methodArgumentNotValidException (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) 발생 java.lang.Exception}

처리 할 사용자 정의 클래스 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;
    }
}

2. 해결방안:

모호성은 동일한 메서드 (ResponseEntityExceptionHandler, MethodArgumentNotValidException) 모두에 @ExceptionHandler라는 동일한 메서드가 있기 때문입니다. 이 문제를 해결하려면 다음과 같이 재정의 된 메서드를 작성해야합니다.

   @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);
   }
65966665
반응형