Discover how a simple annotation can save you hours of tedious error checking!
Why @Valid annotation on request body in Spring Boot? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine building a web app where users submit forms, and you manually check every field for errors like empty names or invalid emails.
Manually validating each input is slow, repetitive, and easy to forget, leading to bugs and poor user experience.
The @Valid annotation automatically checks the request data against rules, catching errors before your code runs.
if (user.getEmail() == null || !user.getEmail().contains("@")) { return error; }
@PostMapping
public ResponseEntity<?> create(@Valid @RequestBody User user) { ... }It lets you focus on your app logic while ensuring data is correct and safe, improving reliability and speed.
When a user signs up, @Valid checks their email and password format automatically, so you don't have to write extra code.
Manual validation is slow and error-prone.
@Valid automates input checks on request data.
This leads to cleaner code and better user experience.
Practice
@Valid annotation on a @RequestBody parameter in a Spring Boot controller?Solution
Step 1: Understand the role of
The@Valid@Validannotation triggers validation of the request body object based on constraints defined in its class.Step 2: Connect validation to request handling
When placed before@RequestBody, it ensures the data is checked before the controller method uses it.Final Answer:
To automatically check if the incoming request data meets the validation rules defined in the data class. -> Option AQuick Check:
@Validvalidates input data [OK]
- Thinking @Valid converts or logs data
- Placing @Valid after @RequestBody
- Assuming @Valid caches data
@Valid in a Spring Boot controller method parameter?Solution
Step 1: Recall annotation order for parameters
In Spring Boot,@Validmust come before@RequestBodyon the same parameter.Step 2: Check each option's syntax
Only public ResponseEntity create(@Valid @RequestBody User user) { ... } correctly places@Validbefore@RequestBodyon the parameter.Final Answer:
public ResponseEntity create(@Valid @RequestBody User user) { ... } -> Option CQuick Check:
Correct annotation order = public ResponseEntity create(@Valid @RequestBody User user) { ... } [OK]
- Placing @Valid after @RequestBody
- Separating annotations incorrectly
- Using @Valid without @RequestBody
{}?
public record User(@NotBlank String name, @Min(18) int age) {}
@PostMapping("/users")
public ResponseEntity<String> addUser(@Valid @RequestBody User user) {
return ResponseEntity.ok("User added");
}Solution
Step 1: Analyze validation constraints on User record
@NotBlankrequires 'name' to be non-empty;@Min(18)requires 'age' to be at least 18.Step 2: Consider empty JSON input effects
Empty JSON means 'name' and 'age' are missing, so validation fails for both fields.Final Answer:
The request fails validation because 'name' is blank and 'age' is missing. -> Option DQuick Check:
Missing required fields cause validation failure [OK]
- Assuming missing fields pass validation
- Thinking @Valid ignores records
- Assuming default values apply automatically
@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestBody @Valid User user) {
return ResponseEntity.ok("Registered");
}
But when you send invalid data, no validation errors occur and the method runs normally. What is the most likely cause?Solution
Step 1: Check if User class has validation rules
If the User class lacks validation annotations like@NotNull,@NotBlank, etc.,@Validhas nothing to check.Step 2: Understand validation behavior
Without constraints, validation passes silently, so the method runs normally even with invalid data.Final Answer:
The User class does not have any validation annotations. -> Option BQuick Check:
No constraints = no validation errors [OK]
- Assuming @Validated is always required
- Thinking annotation order causes no validation
- Believing Spring Boot disables validation by default
name (required, not blank) and price (required, positive number). Which of the following code snippets correctly applies @Valid and validation annotations to ensure invalid data is rejected automatically?Solution
Step 1: Identify correct validation annotations
@NotBlankensures 'name' is not empty;@Positiveensures 'price' is greater than zero.Step 2: Check usage of @Valid and @RequestBody
public record Product(@NotBlank String name, @Positive double price) {} @PostMapping("/products") public ResponseEntity<String> addProduct(@Valid @RequestBody Product product) { return ResponseEntity.ok("Product added"); } correctly places@Validbefore@RequestBodyin the controller method parameter.Step 3: Verify other options
public class Product { public String name; public double price; } @PostMapping("/products") public ResponseEntity<String> addProduct(@RequestBody Product product) { return ResponseEntity.ok("Product added"); } lacks validation annotations and@Valid. public record Product(String name, double price) {} @PostMapping("/products") public ResponseEntity<String> addProduct(@RequestBody @Valid Product product) { return ResponseEntity.ok("Product added"); } misses validation annotations. public record Product(@NotNull String name, @Min(1) double price) {} @PostMapping("/products") public ResponseEntity<String> addProduct(@RequestBody Product product) { return ResponseEntity.ok("Product added"); } uses@Min(1)on a double (should use@Positive) and misses@Valid.Final Answer:
public record Product(@NotBlank String name, @Positive double price) {} @PostMapping("/products") public ResponseEntity<String> addProduct(@Valid @RequestBody Product product) { return ResponseEntity.ok("Product added"); } -> Option AQuick Check:
Use @Valid + proper annotations = public record Product(@NotBlank String name, @Positive double price) {} @PostMapping("/products") public ResponseEntity<String> addProduct(@Valid @RequestBody Product product) { return ResponseEntity.ok("Product added"); } [OK]
- Omitting @Valid in controller method
- Using wrong validation annotations for types
- Not annotating fields in data class
