0Pricing
Java Academy · บทเรียน

การตรวจสอบ Bean: @NotNull, @Size, @Pattern

ใส่ข้อจำกัดการตรวจสอบ Bean ให้ DTO และเรียกใช้การตรวจสอบด้วย @Valid ในคอนโทรลเลอร์

การตรวจสอบ Bean: @NotNull, @Size, @Pattern เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

การตรวจสอบความถูกต้องของบีนคืออะไร

การตรวจสอบความถูกต้องของบีน (การตรวจสอบความถูกต้องของบีนของจาการ์ตา รุ่น 3.0) มีคำอธิบายประกอบข้อจำกัดแบบประกาศสำหรับบีนของ Java โดย Spring Boot จะกำหนดค่าตัวตรวจสอบโดยอัตโนมัติ และเรียกใช้ผ่าน @Valid หรือ @Validated

@NotNull, @NotEmpty, @NotBlank

@NotNull: ค่าต้องไม่เป็นค่าว่าง @NotEmpty: ต้องไม่เป็นค่าว่างและต้องไม่ว่างเปล่า (สำหรับสตริงหรือคอลเลกชัน) @NotBlank: ต้องไม่เป็นค่าว่าง ไม่ว่างเปล่า และต้องไม่ประกอบด้วยช่องว่างเพียงอย่างเดียว ควรใช้ @NotBlank กับสตริง

public record CreateUserRequest(
    @NotBlank(message = "Name is required")
    String name,
    @NotBlank @Email
    String email,
    @NotNull
    UserRole role
) {}

@Size และ @Length

@Size(min, max) ใช้จำกัดขนาดของสตริง คอลเลกชัน แมป และอาร์เรย์ ส่วน @Length (Hibernate) ใช้ได้เฉพาะกับสตริง ควรเลือกใช้ @Size เพื่อให้พกพาไปใช้กับระบบอื่นได้

@Size(min = 3, max = 50, message = "Name must be 3-50 characters")
private String name;
@Size(min = 1, max = 10, message = "Cart must have 1-10 items")
private List<CartItem> items;

@Min, @Max, @Positive, @Range

ข้อจำกัดด้านตัวเลข: @Min/@Max ใช้กำหนดขอบเขตที่แน่นอน @Positive/@PositiveOrZero ใช้กำหนดข้อจำกัดด้านเครื่องหมาย และ @DecimalMin/@DecimalMax ใช้กับ BigDecimal

@Min(1) @Max(100)
private int quantity;
@DecimalMin("0.01") @DecimalMax("99999.99")
private BigDecimal price;
@Positive
private long orderId;

@Pattern สำหรับการตรวจสอบนิพจน์ทั่วไป

@Pattern(regexp) ตรวจสอบสตริงโดยเทียบกับนิพจน์ทั่วไป เหมาะสำหรับหมายเลขโทรศัพท์ รหัสไปรษณีย์ และรูปแบบที่กำหนดเอง

@Pattern(regexp = "^\\+?[1-9]\\d{7,14}$", message = "Invalid phone number")
private String phone;
@Pattern(regexp = "^[A-Z]{2}\\d{5}$", message = "Invalid postal code (e.g. AB12345)")
private String postalCode;

@Email และ @URL

@Email ตรวจสอบรูปแบบอีเมลตามกฎพื้นฐานของ RFC 5321 ส่วน @URL (Hibernate) ตรวจสอบรูปแบบ URL ควรใช้ร่วมกับ @NotBlank เสมอ เนื่องจากทั้งสองคำอธิบายประกอบนี้อนุญาตให้เป็นค่าว่างได้

@NotBlank @Email
private String email;
// Hibernate-specific:
@URL(protocol = "https")
private String profileUrl;

@Past, @Future, @PastOrPresent

ข้อจำกัดด้านเวลาจะตรวจสอบค่าวันที่และเวลา ใช้ได้กับ LocalDate, LocalDateTime, Instant และชนิดอื่น ๆ

@Past(message = "Birth date must be in the past")
private LocalDate birthDate;
@Future(message = "Expiry must be in the future")
private LocalDate expiryDate;

การเรียกใช้การตรวจสอบด้วย @Valid

เพิ่ม @Valid ให้กับพารามิเตอร์ของเมธอดตัวควบคุม Spring จะตรวจสอบออบเจ็กต์และโยน MethodArgumentNotValidException เมื่อตรวจสอบไม่ผ่าน พร้อมส่งคืนข้อผิดพลาด 400 คำขอไม่ถูกต้อง

@PostMapping("/users")
public ResponseEntity<UserDto> create(@Valid @RequestBody CreateUserRequest req) {
    User user = userService.create(req);
    return ResponseEntity.status(201).body(UserDto.from(user));
}

การตรวจสอบแบบต่อเนื่องด้วย @Valid บนฟิลด์

หากต้องการตรวจสอบออบเจ็กต์ซ้อนกัน ให้ใส่คำอธิบายประกอบ @Valid ที่ฟิลด์นั้นเพิ่มเติมจากข้อจำกัดระดับคลาส

public record OrderRequest(
    @NotNull @Valid
    AddressRequest shippingAddress, // validates AddressRequest constraints too
    @Valid @NotEmpty
    List<@Valid LineItemRequest> items
) {}

กลุ่มการตรวจสอบ

ใช้กลุ่มเพื่อใช้ข้อจำกัดที่แตกต่างกันในบริบทที่ต่างกัน (เช่น การสร้างกับการปรับปรุง) ใส่คำอธิบายประกอบด้วยอินเทอร์เฟซของกลุ่ม และเรียกใช้ด้วย @Validated(CreateGroup.class)

public interface CreateGroup {}
public interface UpdateGroup {}
public record UserRequest(
    @NotBlank(groups = CreateGroup.class) String password,
    @NotNull(groups = UpdateGroup.class)  Long id
) {}
// Controller:
@PutMapping("/{id}")
public UserDto update(@Validated(UpdateGroup.class) @RequestBody UserRequest req) { ... }

การอ่านข้อผิดพลาดจากการตรวจสอบ

ดักจับ MethodArgumentNotValidException ใน @ControllerAdvice เพื่อดึงข้อผิดพลาดของฟิลด์และสร้างการตอบกลับข้อผิดพลาดที่มีโครงสร้าง

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new LinkedHashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(e ->
        errors.put(e.getField(), e.getDefaultMessage()));
    return ResponseEntity.badRequest().body(errors);
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

คำอธิบายประกอบใดตรวจสอบว่า String ไม่เป็นค่าว่าง และไม่เว้นว่าง (ไม่ใช่แค่ช่องว่าง)

สรุปทบทวน

ใส่ข้อจำกัดการตรวจสอบความถูกต้องของบีนให้กับออบเจ็กต์ถ่ายโอนข้อมูล เพิ่ม @Valid ในตัวควบคุมเพื่อเรียกใช้การตรวจสอบ ใช้ @NotBlank กับสตริง @Size สำหรับความยาว @Pattern สำหรับนิพจน์ทั่วไป และ @Past/@Future สำหรับวันที่ จัดการข้อผิดพลาดใน @ControllerAdvice

คำถามที่พบบ่อย

บทเรียน “การตรวจสอบ Bean: @NotNull, @Size, @Pattern” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตรวจสอบ Bean: @NotNull, @Size, @Pattern” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบ Bean: @NotNull, @Size, @Pattern”

ใส่ข้อจำกัดการตรวจสอบ Bean ให้ DTO และเรียกใช้การตรวจสอบด้วย @Valid ในคอนโทรลเลอร์ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การตรวจสอบ Bean: @NotNull, @Size, @Pattern” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตรวจสอบ Bean: @NotNull, @Size, @Pattern
  2. คำอธิบายข้อจำกัดแบบกำหนดเอง
  3. การจัดการข้อยกเว้นแบบรวมศูนย์ด้วย @ControllerAdvice
  4. รายละเอียดปัญหา RFC 7807 และการตอบกลับข้อผิดพลาดอย่างสอดคล้อง
← กลับไปที่ Java Academy