Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.cons

경쓱타드·2024년 4월 2일
0

에러

목록 보기
7/7

에러 상황

2024-04-02 14:08:00.854 ERROR 8004 --- [-nio-443-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'java.lang.Integer'. Check configuration for 'count'] with root cause

아래의 코드로 api 요청을 받았는데, 위와 같은 에러가 났다. count의 Integer과 int형 충돌이 나는거 같은데, 쉽게 해결되지 않았다.

public class TARequestDto {
    @AllArgsConstructor
    @Setter
    @Getter
    public static class Post {
        @Size(min = 1, max = 20, message = "1에서 20 사이 숫자만 가능합니다.")
        private Integer count ; // 전화 횟수(1 ~ 20)
    }

해결방법

  • @Valid 코드를 넣기도 했고, entity 클래스에 count의 데이터형을 int와 Integer로 계속 바꿔봤다. 여전히 해결되지 않아서 service에서 count를 처리하는 코드가 문제인가 해서 주석처리해서 컴파일해봤지만 여전히 똑같은 에러가 났다.
  • 그래서 아래와 같이 @Size 어노테이션 대신에 @Min과 @Max를 이용해서 코드를 구현했다.
public class TARequestDto {
    @AllArgsConstructor
    @Valid
    @Setter
    @Getter
    public static class Post {
        private long customerPk; // 고객 식별자

        @Min(value = 1, message = "최소 1 이상이어야 합니다.")
        @Max(value = 20, message = "최대 20 이하여야 합니다.")
        private Integer count ; // 전화 횟수(1 ~ 20)
    }
  • 이유 : ChatGPT 이용한 결과

    @Size 어노테이션은 문자열, 컬렉션 및 배열과 같은 요소의 크기를 유효성 검사하는 데 사용됩니다. 하지만 int 타입의 변수에는 적용할 수 없습니다. @Size 어노테이션은 요소의 크기를 검사하는 것이지 숫자 값의 범위를 검사하는 것은 아니기 때문에 int 타입에 사용할 수 없습니다.
    따라서 int 타입 변수의 범위를 검사하기 위해서는 @Min과 @Max 어노테이션을 사용해야 합니다. 이러한 어노테이션은 숫자 값의 최솟값과 최댓값을 검사하는 데에 사용됩니다.

즉, @Size는 int에 적용할 수 없기 때문에 @Min과 @Max를 사용해야 했다. 다음에는 어노테이션에 대해서 제대로 알고 사용해야겠다.

profile
백엔드 개발자를 시작으로 도메인 이해도까지 풍부한 개발자가 목표입니다!

0개의 댓글