Bean Validation Deep Dive
Bean Validation (Jakarta Validation), DECLARATIVE ANNOTATIONS SE, DTO FIELDS PAR, VALIDATION RULES DEFINE karne DETA hai — @NotBlank (STRING, NULL/EMPTY NAHI), @NotNull (NULL NAHI, LEKIN EMPTY STRING OK), @Size(min, max), @Email, @Min/@Max (NUMBERS), @Pattern (REGEX).
Controller mein, @Valid annotation SE, VALIDATION, ENFORCE ki jaati hai — AGAR VALIDATION FAIL hoती hai, Spring, AUTOMATICALLY, MethodArgumentNotValidException THROW karta hai, JO, DEFAULT mein, 400 Bad Request RESPONSE mein, CONVERT ho jaata hai.
public class ProductCreateDto {
@NotBlank(message = "Name is required")
private String name;
@NotNull(message = "Price is required")
@Positive(message = "Price must be positive")
private BigDecimal price;
@Size(max = 500, message = "Description max 500 characters")
private String description;
@Email(message = "Invalid email format")
private String contactEmail;
}
@PostMapping
public ResponseEntity<ProductDto> create(@Valid @RequestBody ProductCreateDto dto) {
// Agar dto INVALID hai, is METHOD tak PAHUNCHTA hi nahi —
// Spring AUTOMATICALLY 400 Bad Request return kar deta hai
}- @NotBlank/@NotNull/@Size/@Email/@Positive = COMMON validation annotations
- @Valid, controller mein, VALIDATION enforce karta hai
- Invalid data par, AUTOMATICALLY, 400 Bad Request — manual if-checks ki zaroorat NAHI
Validation GROUPS SE, SAME DTO ke liye, DIFFERENT SCENARIOS (CREATE vs UPDATE) mein, DIFFERENT RULES, APPLY ki ja sakti hain — jaise, CREATE ke waqt, id, NULL HONA CHAHIYE, UPDATE ke waqt, REQUIRED hai.
@Null(groups = OnCreate.class)
@NotNull(groups = OnUpdate.class)
private Long id;AGAR, EK DTO ke, ANDAR, EK, DUSRA OBJECT hai (jaise, Address), USKE, FIELDS ko, VALIDATE karne ke liye, PARENT, FIELD PAR, @Valid, ANNOTATION, LAGANA, ZAROORI hai — WARNA, NESTED, OBJECT ki, VALIDATION, SILENTLY, SKIP ho jaati hai.
public class OrderCreateDto {
@Valid // BINA ISKE, Address ke fields, VALIDATE NAHI HONGE
@NotNull
private AddressDto shippingAddress;
}