The @Valid annotation checks if the data sent to your app is correct before using it. It helps catch mistakes early.
@Valid annotation on request body in Spring Boot
Start learning this pattern below
Jump into concepts and practice - no test required
@PostMapping("/example")
public ResponseEntity<?> exampleMethod(@Valid @RequestBody ExampleDto dto) {
// method body
}The @Valid annotation is placed before the @RequestBody parameter.
The class of the request body (like ExampleDto) must have validation annotations on its fields.
UserDto object sent in the request body before processing.@PostMapping("/user")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDto user) {
// save user
}public record ProductDto(@NotBlank String name, @Positive int quantity) {}ProductDto.@PostMapping("/product")
public ResponseEntity<?> addProduct(@Valid @RequestBody ProductDto product) {
// add product
}This Spring Boot controller has a POST endpoint /api/users. It expects a JSON body matching UserDto with rules: name not blank, email valid, age at least 18. If validation passes, it returns a success message.
import jakarta.validation.Valid; import jakarta.validation.constraints.*; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class SampleController { public record UserDto( @NotBlank(message = "Name is required") String name, @Email(message = "Email must be valid") String email, @Min(value = 18, message = "Age must be at least 18") int age ) {} @PostMapping("/users") public ResponseEntity<String> createUser(@Valid @RequestBody UserDto user) { return ResponseEntity.ok("User " + user.name() + " created successfully."); } }
Validation errors automatically return a 400 Bad Request with error details if you have Spring Boot's default error handling.
Use annotations like @NotBlank, @Email, @Min on fields inside your DTO class to define rules.
Make sure to include spring-boot-starter-validation dependency in your project to enable validation.
@Valid checks request body data before your method uses it.
Put @Valid before @RequestBody parameter in controller methods.
Define rules inside the data class with validation annotations.
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
