간단한 API 테스트 중 에러 발생. 에러 메세지는 아래와 같다.
ERROR [DirectJDKLog.java - log] - 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.NotEmpty' validating type 'java.lang.Long'. Check configuration for 'userid'] with root cause
DTO를 생성 할 때 요청받을 파라미터 값 중 null 값 유효성 체크를 하기위해
'javax.validation.consstraints' 패키지
에 있는 어노테이션을 사용하는데, 필드 중 하나에 잘 못된 어노테이션을 붙여서 에러가 발생했다.
에러 메세지를 읽어보면 'java.lang.Long' 타입에는 NotEmpty 어노테이션을 붙일 수 없으니 필드 'userid'를 확인해보라고 한다.
이 문제를 수정하기 위해선 각 어노테이션을 알아 볼 필요가 있다.
@NotNull
Null인지 아닌지를 검증한다. null을 전달 받을 경우 Exception이 발생하지만 ""나 " "와 같은 빈값이 들어올때는 null이 아닌 String으로 인식하기 때문에 유효성을 통과하게 된다. ""이나 공백 값이 들어올 경우 통과 되지만 Null이 들어올 경우 예외를 발생시켜야 할 때 사용한다.
Integer, Long, CharSequence, Collection, Map, Array 타입에 사용가능하다.
@NotEmpty
빈 값을 체크한다. 요청 값으로 Null과 ""를 전달 받으면 Exception이 발생한다. 다만 " " 공백으로 된 String 값은 유효성이 통과된다.
@NotEmpty는 각 타입의 길이나 size가 0인지 아닌지를 기준으로 빈값을 판별하게 되는데, " " 는 length가 0 이상이어서 validation에 걸리지 않는다.
CharSequence, Collection, Map, Array 타입에 사용가능하다.
@NotBlank
Null과 "", " " 모두 허용하지 않는다. 3개의 어노테이션 중 가장 validation 강도가 높다고 할 수 있다. 문자열의 공백을 제거하고 길이 값을 체크하기 때문에 Null, "", " " 요청 값이 들어올 경우 모두 validation에 걸린다.
String 타입만 사용 가능하다.
@Getter
Public Class User {
@NotNull
private long userid
위 DTO 클래스에서 long 타입의 필드에 달려있던 @NotEmpty 어노테이션을 @NotNull로 수정하니 잘 된다.