Request Validation
Bean Validation (Jakarta Validation) annotations — @NotBlank, @NotNull, @Email, @Min, @Max, @Size — DTO CLASSES par LAGAई jaati hain, aur CONTROLLER mein @Valid annotation se, ENFORCE kiya jaata hai. AGAR VALIDATION FAIL hoती hai, Spring AUTOMATICALLY 400 BAD REQUEST response GENERATE kar deta hai, DETAILED error messages ke saath.
spring-boot-starter-validation dependency ADD karne se, YE SAARA MECHANISM AUTOMATICALLY WORK karta hai — MANUAL if-checks (jaise if (name == null || name.isEmpty())) LIKHNE ki zaroorat NAHI, ANNOTATIONS hi SAARA VALIDATION LOGIC DECLARE kar dete hain.
public class UserDto {
@NotBlank(message = "Name is required")
private String name;
@Email(message = "Invalid email format")
private String email;
@Min(value = 18, message = "Must be at least 18 years old")
private int age;
}
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping
public ResponseEntity<User> create(@Valid @RequestBody UserDto dto) {
// Agar dto INVALID hai, is METHOD tak PAHUNCHTA hi nahi —
// Spring AUTOMATICALLY 400 Bad Request return kar deta hai
return ResponseEntity.status(HttpStatus.CREATED).body(userService.create(dto));
}
}- Bean Validation annotations (@NotBlank, @Email, @Min) = DECLARATIVE validation rules
- @Valid controller mein = automatic 400 response, agar validation FAIL ho
- Manual if-checks ki zaroorat NAHI — annotations SAARA logic HANDLE karte hain
Built-in validation annotations (@NotBlank, @Email) ke ALAWA, APNE KHUD KE CUSTOM validation annotations bhi banaए ja sakte hain — jaise @ValidPhoneNumber, jo COMPANY-SPECIFIC phone number FORMAT validate kare.
@Constraint(validatedBy = PhoneNumberValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPhoneNumber {
String message() default "Invalid phone number";
}
public class PhoneNumberValidator implements ConstraintValidator<ValidPhoneNumber, String> {
public boolean isValid(String value, ConstraintValidatorContext ctx) {
return value != null && value.matches("\\d{10}");
}
}Validation GROUPS se, SAME class ke liye, DIFFERENT SCENARIOS mein (jaise CREATE vs UPDATE) DIFFERENT VALIDATION RULES apply ki ja sakti hain — jaise CREATE ke waqt ID null HONA CHAHIYE, UPDATE ke waqt ID REQUIRED hai.
public class UserDto {
@Null(groups = OnCreate.class)
@NotNull(groups = OnUpdate.class)
private Long id;
}
@PostMapping
public User create(@Validated(OnCreate.class) @RequestBody UserDto dto) { }