التحقق من صحة الـ beans: @NotNull و@Size و@Pattern
أضف قيود Bean Validation إلى DTOs، وشغّل التحقق باستخدام @Valid في وحدات التحكم
التحقق من صحة الـ beans: @NotNull و@Size و@Pattern درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما هو Bean Validation؟
يوفّر Bean Validation (Jakarta Bean Validation 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 Bad Request.
@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 غير فارغ وغير مكوّن من مسافات بيضاء فقط؟
مراجعة
ضعوا قيود Bean Validation على DTOs. وأضيفوا @Valid في وحدات التحكم لتشغيل التحقق. استخدموا @NotBlank للسلاسل النصية، و@Size للأطوال، و@Pattern للتعبيرات النمطية، و@Past/@Future للتواريخ. وعالجوا الأخطاء في @ControllerAdvice.
الأسئلة الشائعة
هل درس «التحقق من صحة الـ beans: @NotNull و@Size و@Pattern» مجاني؟
نعم — نص درس «التحقق من صحة الـ beans: @NotNull و@Size و@Pattern» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحقق من صحة الـ beans: @NotNull و@Size و@Pattern»؟
أضف قيود Bean Validation إلى DTOs، وشغّل التحقق باستخدام @Valid في وحدات التحكم تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التحقق من صحة الـ beans: @NotNull و@Size و@Pattern»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التحقق من صحة الـ beans: @NotNull و@Size و@Pattern
- تعليقات القيود المخصصة
- معالجة الاستثناءات العامة باستخدام @ControllerAdvice
- تفاصيل المشكلة وفق RFC 7807 واستجابات الأخطاء المتسقة