From 4e99e5b62f28d52aeaf7d0b5a92f5f2dedf4adc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=ED=9D=AC=EC=A7=84?= Date: Wed, 24 Jun 2026 10:58:46 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20HandlerMethodValidationException=20400?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/GlobalExceptionHandler.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/konkuk/thip/common/exception/handler/GlobalExceptionHandler.java b/src/main/java/konkuk/thip/common/exception/handler/GlobalExceptionHandler.java index 2fba5aed8..4f17ec836 100644 --- a/src/main/java/konkuk/thip/common/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/konkuk/thip/common/exception/handler/GlobalExceptionHandler.java @@ -14,10 +14,12 @@ import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.HandlerMethodValidationException; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.NoHandlerFoundException; import java.util.Optional; +import java.util.stream.Stream; import static konkuk.thip.common.exception.code.ErrorCode.*; import static konkuk.thip.common.logging.LoggingConstant.REQUEST_ID; @@ -143,6 +145,21 @@ public ResponseEntity handleServerErrors(Exception e) { .body(ErrorResponse.of(API_SERVER_ERROR)); } + // Spring 6.1+ @Validated 컨트롤러 파라미터 검증 실패 예외처리 + @ExceptionHandler(HandlerMethodValidationException.class) + public ResponseEntity handlerMethodValidationExceptionHandler(HandlerMethodValidationException e) { + log.warn("[HandlerMethodValidationExceptionHandler] {}", e.getMessage()); + String errorMessage = Stream.concat(e.getBeanResults().stream(), e.getValueResults().stream()) + .flatMap(result -> result.getResolvableErrors().stream()) + .findFirst() + .map(error -> error.getDefaultMessage()) + .orElse("유효성 검사에 실패했습니다."); + + return ResponseEntity + .status(API_INVALID_PARAM.getHttpStatus()) + .body(ErrorResponse.of(API_INVALID_PARAM, errorMessage)); + } + // @validation 예외처리 @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e) {