문제
코드 테스트 중 아래와 같은 에러가 발생했다.
Exception : class jakarta.validation.UnexpectedTypeException HV000030: No validator could be found for constraint 'jakarta.validation.constraints.NotBlank' validating type 'java.util.List<java.lang.String>'. Check configuration for 'categoryTypes'
에러 메세지를 보면 CategoryTypes와 Validation의 문제로 오류가 발생한 것 같았다.
당시 CategoryTypes의 유효성 검증을 하는 dto는 아래와 같이 작성되어 있었다.
@Getter
@Valid
@AllArgsConstructor
public class PostCreateRequestDto {
@Size(min=1, max=1000, message = "게시글은 1000글자 이내여야 합니다.")
@NotBlank(message = "게시글 내용은 필수값 입니다.")
private final String content;
private final List<String> imgUrls;
@NotBlank(message = "카테고리는 필수값 입니다.")
private final List<String> categoryTypes;
@NotBlank(message = "공개범위는 필수값 입니다.")
@ValidEnum(target = Visibility.class)
private final String visibility;
}
원인
검색해보니 @NotBlank는 String 타입의 값이 하나만 들어왔을 때 적용 가능한 유효성 검증 어노테이션이었다.
따라서 이 오류는 하나의 값만 들어왔어야 할 필드에 리스트가 들어와서 데이터를 정상적으로 처리하지 못해 발생하는 문제였다.
이 문제를 해결하기 위해서는 @NotEmpty 또는 @Size(min = 1)을 사용해서 해당 값이 비어있지 않도록 검증해야 한다.
해결
@Getter
@Valid
@AllArgsConstructor
public class PostCreateRequestDto {
@Size(min=1, max=1000, message = "게시글은 1000글자 이내여야 합니다.")
@NotBlank(message = "게시글 내용은 필수값 입니다.")
private final String content;
private final List<String> imgUrls;
@NotEmpty(message = "카테고리는 필수값 입니다.")
private final List<String> categoryTypes;
@NotBlank(message = "공개범위는 필수값 입니다.")
@ValidEnum(target = Visibility.class)
private final String visibility;
}
코드를 위와 같이 수정하면 프로그램이 제대로 동작하면서 게시글 생성 API가 데이터를 잘 저장하는 것을 볼 수 있었다.
'트러블 슈팅' 카테고리의 다른 글
과제 트러블슈팅 (1) | 2025.05.15 |
---|---|
@CreateBy 사용 시, 화이트리스트 요청될 때 유저 정보 null 처리 (0) | 2025.05.13 |
직렬화 실패 이슈 해결 (0) | 2025.04.10 |
[Java/Spring] Spring Data JPA 메서드명 설정, JPQL 사용 (0) | 2025.04.08 |
[Java/Spring] Filter 내부의 예외처리 (0) | 2025.04.03 |