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)
}
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)
}
@Size 어노테이션은 문자열, 컬렉션 및 배열과 같은 요소의 크기를 유효성 검사하는 데 사용됩니다. 하지만 int 타입의 변수에는 적용할 수 없습니다. @Size 어노테이션은 요소의 크기를 검사하는 것이지 숫자 값의 범위를 검사하는 것은 아니기 때문에 int 타입에 사용할 수 없습니다.
따라서 int 타입 변수의 범위를 검사하기 위해서는 @Min과 @Max 어노테이션을 사용해야 합니다. 이러한 어노테이션은 숫자 값의 최솟값과 최댓값을 검사하는 데에 사용됩니다.
즉, @Size는 int에 적용할 수 없기 때문에 @Min과 @Max를 사용해야 했다. 다음에는 어노테이션에 대해서 제대로 알고 사용해야겠다.