Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Using @Valid Annotation on Request Body in Spring Boot
📖 Scenario: You are building a simple Spring Boot REST API to register users. You want to make sure the user data sent in the request body is valid before processing it.
🎯 Goal: Learn how to use the @Valid annotation on a request body to automatically validate incoming data in a Spring Boot controller.
📋 What You'll Learn
Create a User class with validation annotations
Create a controller method that accepts a User object in the request body
Use the @Valid annotation on the request body parameter
Add a configuration to handle validation errors gracefully
💡 Why This Matters
🌍 Real World
Validating user input in REST APIs is essential to prevent bad data from entering your system and to provide clear feedback to API clients.
💼 Career
Backend developers often need to validate incoming data in web applications. Knowing how to use @Valid in Spring Boot is a common and important skill.
Progress0 / 4 steps
1
Create User class with validation annotations
Create a class called User with two fields: String name and String email. Add @NotBlank annotation on name and @Email annotation on email. Import the annotations from jakarta.validation.constraints.
Spring Boot
Hint
Use @NotBlank on the name field and @Email on the email field inside the User class.
2
Create controller with POST method accepting User
Create a Spring REST controller class called UserController. Add a method registerUser that handles POST requests at /users. The method should accept a @RequestBody User user parameter and return String.
Spring Boot
Hint
Use @RestController on the class and @PostMapping("/users") on the method. The method should accept @RequestBody User user.
3
Add @Valid annotation to request body parameter
Modify the registerUser method to add the @Valid annotation before the @RequestBody User user parameter to enable validation.
Spring Boot
Hint
Put @Valid right before @RequestBody User user in the method parameter.
4
Add exception handler for validation errors
Add a method in UserController annotated with @ExceptionHandler(MethodArgumentNotValidException.class) that returns a String message "Validation failed" when validation errors occur.
Spring Boot
Hint
Create a method annotated with @ExceptionHandler(MethodArgumentNotValidException.class) that returns the string "Validation failed".
Practice
(1/5)
1. What is the main purpose of using the @Valid annotation on a @RequestBody parameter in a Spring Boot controller?
easy
A. To automatically check if the incoming request data meets the validation rules defined in the data class.
B. To convert the request body into a JSON string.
C. To log the request body content for debugging.
D. To cache the request body for faster access.
Solution
Step 1: Understand the role of @Valid
The @Valid annotation 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 A
Quick Check:
@Valid validates input data [OK]
Hint: Remember: @Valid checks data correctness before method runs [OK]
Common Mistakes:
Thinking @Valid converts or logs data
Placing @Valid after @RequestBody
Assuming @Valid caches data
2. Which of the following is the correct way to use @Valid in a Spring Boot controller method parameter?
easy
A. public ResponseEntity create(@RequestBody User user @Valid) { ... }
B. public ResponseEntity create(@Valid User user @RequestBody) { ... }
C. public ResponseEntity create(@Valid @RequestBody User user) { ... }
D. public ResponseEntity create(User user @Valid @RequestBody) { ... }
Solution
Step 1: Recall annotation order for parameters
In Spring Boot, @Valid must come before @RequestBody on the same parameter.
Step 2: Check each option's syntax
Only public ResponseEntity create(@Valid @RequestBody User user) { ... } correctly places @Valid before @RequestBody on the parameter.
Final Answer:
public ResponseEntity create(@Valid @RequestBody User user) { ... } -> Option C
Quick Check:
Correct annotation order = public ResponseEntity create(@Valid @RequestBody User user) { ... } [OK]
Hint: Put @Valid before @RequestBody on the same parameter [OK]
Common Mistakes:
Placing @Valid after @RequestBody
Separating annotations incorrectly
Using @Valid without @RequestBody
3. Given the following controller method and data class, what happens when a POST request sends an empty JSON object {}?
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");
}
medium
A. The request succeeds but 'age' defaults to 0.
B. The request succeeds and returns 'User added'.
C. The request fails because @Valid is ignored on records.
D. The request fails validation because 'name' is blank and 'age' is missing.
Solution
Step 1: Analyze validation constraints on User record
@NotBlank requires '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 D
Quick Check:
Missing required fields cause validation failure [OK]
Hint: Empty JSON fails @NotBlank and @Min validations [OK]
Common Mistakes:
Assuming missing fields pass validation
Thinking @Valid ignores records
Assuming default values apply automatically
4. You have this controller method:
@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?
medium
A. Missing @Validated annotation on the controller class or configuration.
B. The User class does not have any validation annotations.
C. The @Valid annotation is placed after @RequestBody.
D. Spring Boot does not support validation on request bodies.
Solution
Step 1: Check if User class has validation rules
If the User class lacks validation annotations like @NotNull, @NotBlank, etc., @Valid has 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 B
Quick Check:
No constraints = no validation errors [OK]
Hint: Validation needs annotations in the data class [OK]
Common Mistakes:
Assuming @Validated is always required
Thinking annotation order causes no validation
Believing Spring Boot disables validation by default
5. You want to create a Spring Boot API that accepts a JSON request body for a Product with fields 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?
hard
A. public record Product(@NotBlank String name, @Positive double price) {}
@PostMapping("/products")
public ResponseEntity<String> addProduct(@Valid @RequestBody Product product) {
return ResponseEntity.ok("Product added");
}
B. public class Product {
public String name;
public double price;
}
@PostMapping("/products")
public ResponseEntity<String> addProduct(@RequestBody Product product) {
return ResponseEntity.ok("Product added");
}
C. public record Product(String name, double price) {}
@PostMapping("/products")
public ResponseEntity<String> addProduct(@RequestBody @Valid Product product) {
return ResponseEntity.ok("Product added");
}
D. public record Product(@NotNull String name, @Min(1) double price) {}
@PostMapping("/products")
public ResponseEntity<String> addProduct(@RequestBody Product product) {
return ResponseEntity.ok("Product added");
}
Solution
Step 1: Identify correct validation annotations
@NotBlank ensures 'name' is not empty; @Positive ensures '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 @Valid before @RequestBody in 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 A
Quick 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]
Hint: Use @Valid + @NotBlank and @Positive for required fields [OK]