Trong Hibernate Validator 4.1+, sự khác biệt giữa @NotNull, @NotEmpty và @NotBlank là gì?


Câu trả lời:


314

@NotNull: Đối tượng CharSequence, Collection, Map hoặc Array không rỗng , nhưng thể để trống.
@NotEmpty: Đối tượng CharSequence, Collection, Map hoặc Array không được rỗng và kích thước> 0 .
@NotBlank: Chuỗi không rỗng và độ dài được cắt nhỏ hơn 0 .

Để giúp bạn hiểu, hãy xem cách các ràng buộc này được định nghĩa và thực hiện (tôi đang sử dụng phiên bản 4.1):

  1. Các @NotNullhạn chế được định nghĩa là:

    @Constraint(validatedBy = {NotNullValidator.class})  

    Lớp này có một isValidphương thức được định nghĩa là:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
     return object != null;  
    }
  2. Các @NotEmptyhạn chế được định nghĩa là:

    @NotNull  
    @Size(min = 1)    

    Vì vậy, hạn chế này sử dụng các @NotNullhạn chế trên, @Size có định nghĩa khác nhau dựa trên đối tượng nhưng phải tự explanitory.

  3. Cuối cùng, @NotBlankràng buộc được định nghĩa là:

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

    Vì vậy, ràng buộc này cũng sử dụng @NotNullràng buộc, nhưng cũng ràng buộc với lớp NotBlankValidator. Lớp này có một isValidphương thức được định nghĩa là:

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

    Điều thú vị là phương thức này trả về true nếu chuỗi là null, nhưng false nếu và chỉ khi độ dài của chuỗi được cắt bớt là 0. Có thể trả về true nếu nó là null vì như tôi đã đề cập, @NotEmptyđịnh nghĩa cũng yêu cầu @NotNull.

Đây là vài ví dụ:

  1. Tên chuỗi = null;
    @NotNull: false
    @NotEmpty: false
    @NotBlank: false

  2. Tên chuỗi = "";
    @NotNull: true
    @NotEmpty : false
    @NotBlank: false

  3. Tên chuỗi = "";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : false

  4. String name = "Câu trả lời tuyệt vời!";
    @NotNull: true
    @NotEmpty : true
    @NotBlank : true


29
Tôi đã dành thời gian theo dõi thông tin này của riêng mình và tôi muốn giúp những người khác hưởng lợi từ nỗ lực đó. "Nói một cách rõ ràng, việc hỏi và trả lời câu hỏi của riêng bạn không chỉ đơn thuần là OK mà còn được khuyến khích một cách rõ ràng." blog.stackoverflow.com/2011/07/…
Rick Hanlon II

4
Theo tôi, @NotBlank NÊN chấp nhận null. Có một số trường hợp bạn chấp nhận null cho các trường tùy chọn trong đó trống không hợp lệ.
tbraun

1
Tôi đồng ý với điều đó. Nếu bạn muốn không rỗng và không trống, bạn có thể sử dụng cả hai. Vì không phải vậy, bạn có thể viết trình xác thực của riêng mình và sử dụng trình xác thực đó như bạn mong đợi.
Rick Hanlon II,

1
Chỉ cần lưu ý: @NotNull có thể được sử dụng với bất kỳ Đối tượng nào, không chỉ "CharSequence, Collection, Map hoặc Array"; như thực sự mã bạn đã chèn trong điểm 1 hiển thị.
Niccolò

@RickHanlonII Bạn có thể gợi ý rằng làm thế nào để nó được xác thực trong Hibernate Validator 5+. Dường như không còn bất kỳ ConstraintValidatorliên kết nào với các chú thích này nữa .
Steve

7

Tôi thích giải thích trong liên kết dưới đây: http://www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull: Kiểm tra xem giá trị có phải là null hay không, bỏ qua nội dung

@NotEmpty: Kiểm tra xem giá trị có rỗng hay không. Nếu nó chỉ có không gian trống, nó sẽ cho phép nó không trống.

@NotBlank: Kiểm tra xem giá trị có rỗng hay không, trước tiên hãy cắt bớt giá trị. Nó có nghĩa là, nó sẽ không chỉ cho phép không gian trống.

Vì vậy, nếu bạn muốn xác thực rằng một trường không phải là giá trị rỗng nhưng cũng không chỉ có các khoảng trống mà còn là văn bản, bạn nên sử dụng @NotBlank.


1
  1. @NotNull: CharSequence, Collection, Map hoặc Array bị ràng buộc hợp lệ miễn là nó không rỗng, nhưng nó có thể trống
  2. @NotEmpty: CharSequence, Collection, Map hoặc Array bị ràng buộc có giá trị miễn là nó không rỗng và kích thước / chiều dài của nó lớn hơn 0.
  3. @NotBlank: một Chuỗi bị ràng buộc hợp lệ miễn là nó không rỗng và độ dài được cắt nhỏ hơn 0.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.