ใน Hibernate Validator 4.1+ @NotNull, @NotEmpty และ @NotBlank แตกต่างกันอย่างไร


คำตอบ:


314

@NotNull: ออบเจ็กต์ CharSequence, Collection, Map หรือ Array ไม่เป็นโมฆะแต่สามารถว่างได้
@NotEmptyการ CharSequence คอลเลกชันแผนที่หรือวัตถุอาร์เรย์คือไม่เป็นโมฆะและขนาด> 0
@NotBlank: สตริงคือไม่เป็นโมฆะและตัดความยาวเป็นจำนวนมากกว่าศูนย์

เพื่อช่วยให้คุณเข้าใจเรามาดูกันว่าข้อ จำกัด เหล่านี้ถูกกำหนดและดำเนินการอย่างไร (ฉันใช้เวอร์ชัน 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มีความหมายแตกต่างกันไปขึ้นอยู่กับวัตถุ แต่ควรจะ explanitory ตนเอง

  3. ในที่สุด@NotBlankข้อ จำกัด ถูกกำหนดเป็น:

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

    ดังนั้นข้อ จำกัด นี้ยังใช้@NotNullข้อ จำกัด แต่ยังใช้กับคลาส NotBlankValidator ด้วย คลาสนี้มีisValidวิธีการที่กำหนดเป็น:

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

    ที่น่าสนใจคือวิธีนี้จะคืนค่าจริงถ้าสตริงเป็นโมฆะ แต่เป็นเท็จถ้าและเฉพาะในกรณีที่ความยาวของสตริงที่ตัดแต่งเป็น 0 มันก็โอเคที่มันจะคืนค่าเป็นจริงถ้ามันเป็นโมฆะเพราะตามที่ฉันได้กล่าวไป@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
ฉันเห็นด้วยกับสิ่งนั้น หากคุณต้องการไม่เป็นโมฆะและไม่ว่างคุณสามารถใช้ทั้งสองอย่างได้ เนื่องจากไม่เป็นเช่นนั้นคุณสามารถเขียนโปรแกรมตรวจสอบความถูกต้องของคุณเองและใช้สิ่งนั้นตามที่คุณคาดหวัง
Rick Hanlon II

1
หมายเหตุ: @NotNull สามารถใช้ได้กับ Object ใด ๆ ไม่ใช่แค่ "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: ตรวจสอบว่าค่าไม่เป็นโมฆะโดยไม่คำนึงถึงเนื้อหา

@NotEmpty: ตรวจสอบว่าค่าไม่เป็นโมฆะหรือว่างเปล่า หากมีเพียงช่องว่างก็จะปล่อยให้เป็นช่องว่าง

@NotBlank: ตรวจสอบว่าค่าไม่เป็นโมฆะหรือว่างเปล่าโดยตัดทอนค่าก่อน หมายความว่าจะไม่อนุญาตให้มีพื้นที่ว่าง

ดังนั้นหากคุณต้องการตรวจสอบความถูกต้องว่าเขตข้อมูลนั้นไม่เป็นโมฆะ แต่ด้วยว่าไม่ได้มีเพียงช่องว่าง แต่เป็นข้อความคุณควรใช้ @NotBlank


1
  1. @NotNull: CharSequence, Collection, Map หรือ Array ที่มีข้อ จำกัด นั้นใช้ได้ตราบเท่าที่ไม่เป็นโมฆะ แต่สามารถว่างได้
  2. @NotEmpty: CharSequence, Collection, Map หรือ Array ที่มีข้อ จำกัด นั้นใช้ได้ตราบเท่าที่ไม่เป็นโมฆะและขนาด / ความยาวมากกว่าศูนย์
  3. @NotBlank: สตริงที่ถูก จำกัด สามารถใช้ได้ตราบเท่าที่ไม่เป็นโมฆะและความยาวที่ตัดแต่งมีค่ามากกว่าศูนย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.