Web & REST

Request Validation

@Valid, Bean Validation
💡 Validation ek SECURITY CHECKPOINT hai AIRPORT mein — HAR PASSENGER (incoming request) ka SAMAAN (data) CHECK hota hai (validation rules) BOARDING GATE (business logic) tak PAHUNCHNE se PEHLE — INVALID cheezein (bad data) SHURU MEIN hi REJECT ho jaati hain.

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));
    }
}
Validation ek SECURITY CHECKPOINT hai AIRPORT mein — HAR PASSENGER (incoming request) ka SAMAAN (data) CHECK hota hai (validation rules) BOARDING GATE (business logic) tak PAHUNCHNE se PEHLE — INVALID cheezein (bad data) SHURU MEIN hi REJECT ho jaati hain.
1 / 2
⚡ Quick Recap
  • 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
Is page mein (2 subtopics)

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) { }