Hibernate Validator 4.1+에서 @NotNull, @NotEmpty, @NotBlank의 차이점은 무엇입니까?


답변:


314

@NotNull: CharSequence, Collection, Map 또는 Array 객체 는 null 이 아니지만 비어 있을 있습니다.
@NotEmpty다음의 CharSequence, 컬렉션,지도 나 Array 객체가 null이 아닌 크기> 0 .
@NotBlank: 문자열이 널이 아니고 잘린 길이가 0보다 큽니다 .

이해를 돕기 위해 이러한 제약 조건이 어떻게 정의되고 실행되는지 살펴 보겠습니다 (버전 4.1을 사용하고 있습니다).

  1. @NotNull제약 조건은 다음과 같이 정의된다 :

    @Constraint(validatedBy = {NotNullValidator.class})  

    이 클래스에는 isValid다음과 같이 정의 된 메서드가 있습니다.

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. @NotEmpty제약 조건은 다음과 같이 정의된다 :

    @NotNull  
    @Size(min = 1)    

    따라서이 제약 조건 @NotNull 위 의 제약 조건을 사용 하며 @Size 그 정의는 객체에 따라 다르지만 자명해야합니다.

  3. 마지막으로 @NotBlank제약 조건은 다음과 같이 정의됩니다.

    @NotNull  
    @Constraint(validatedBy = {NotBlankValidator.class})        

    따라서이 제약 조건도 제약 조건을 사용 @NotNull하지만 NotBlankValidator 클래스로 제약합니다. 이 클래스에는 isValid다음과 같이 정의 된 메서드가 있습니다.

    if ( charSequence == null ) {  //curious 
      return true;   
    }   
    return charSequence.toString().trim().length() > 0;  

    흥미롭게도이 메서드는 문자열이 null이면 true를 반환하지만 잘린 문자열의 길이가 0 인 경우에만 false를 반환 @NotEmpty합니다 @NotNull. 앞서 언급했듯이 정의에도 .

다음은 몇 가지 예입니다.

  1. 문자열 이름 = null;
    @NotNull: 거짓
    @NotEmpty: 거짓
    @NotBlank: 거짓

  2. 문자열 이름 = "";
    @NotNull:
    @NotEmpty : 거짓
    @NotBlank: 거짓

  3. 문자열 이름 = "";
    @NotNull:
    @NotEmpty :
    @NotBlank : 거짓

  4. String name = "대답!";
    @NotNull:
    @NotEmpty :
    @NotBlank :


29
나는이 정보를 스스로 추적하는 데 시간을 보냈고 다른 사람들이 그 노력의 혜택을 누릴 수 있도록 돕고 싶었습니다. "명확하게 말하면, 자신의 질문에 답하는 것이 단순히 괜찮은 것이 아니라 명시 적으로 권장됩니다." blog.stackoverflow.com/2011/07/…
Rick Hanlon II

4
제 생각에는 @NotBlank는 null을 허용해야합니다. 공백이 유효하지 않은 선택적 필드에 대해 널을 허용하는 경우가 있습니다.
tbraun

1
나는 그것에 동의합니다. null이 아니고 비어 있지 않은 경우 둘 다 사용할 수 있습니다. 그렇지 않기 때문에 자신의 유효성 검사기를 작성하고 예상대로 사용할 수 있습니다.
Rick Hanlon II

1
참고 : @NotNull은 "CharSequence, Collection, Map 또는 Array"뿐만 아니라 모든 개체와 함께 사용할 수 있습니다. 실제로 포인트 1에 삽입 한 코드가 보여줍니다.
Niccolò

@RickHanlonII Hibernate Validator 5+에서 어떻게 유효성이 검사되는지 제안 할 수 있습니까? 더 이상ConstraintValidator 이러한 특수 효과와 관련된 것이없는 것 같습니다 .
Steve

7

아래 링크의 설명이 마음에 들었습니다. http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull : 내용에 관계없이 값이 null이 아닌지 확인합니다.

@NotEmpty : 값이 null 또는 비어 있지 않은지 확인합니다. 빈 공간 만 있으면 비어 있지 않은 것으로 허용합니다.

@NotBlank : 값이 null 또는 비어 있지 않은지 확인하고 값을 먼저 트리밍합니다. 즉, 빈 공간 만 허용하지 않습니다.

따라서 필드가 null이 아니라 빈 공간이 아니라 텍스트 만 포함되어 있는지 확인하려면 @NotBlank를 사용해야합니다.


1
  1. @NotNull: 제한된 CharSequence, Collection, Map 또는 Array는 null이 아닌 한 유효하지만 비어있을 수 있습니다.
  2. @NotEmpty: 제한된 CharSequence, Collection, Map 또는 Array는 null이 아니고 크기 / 길이가 0보다 큰 한 유효합니다.
  3. @NotBlank: 제한된 문자열은 null이 아니고 잘린 길이가 0보다 큰 한 유효합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.