티스토리 뷰

반응형

간단한 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로 수정하니 잘 된다. 

반응형
댓글
공지사항