DTO validation helps check if the data sent to your app is correct before using it. It stops bad or missing data early.
DTO validation in Spring Boot
Start learning this pattern below
Jump into concepts and practice - no test required
public class UserDTO { @NotNull @Size(min = 2, max = 30) private String name; @Email private String email; @Min(18) private Integer age; // getters and setters }
Use annotations like @NotNull, @Size, @Email, @Min on DTO fields.
Spring Boot automatically checks these when you add @Valid in your controller method parameter.
public class ProductDTO { @NotBlank private String productName; @Positive private Double price; // getters and setters }
public class LoginDTO { @NotEmpty private String username; @NotEmpty private String password; // getters and setters }
This Spring Boot controller accepts a POST request with JSON data for a user. It checks the data using DTO validation annotations. If data is invalid, Spring returns errors automatically. If valid, it returns a success message.
import jakarta.validation.Valid; import jakarta.validation.constraints.*; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.springframework.http.ResponseEntity; @RestController @RequestMapping("/users") @Validated public class UserController { public static class UserDTO { @NotNull(message = "Name is required") @Size(min = 2, max = 30, message = "Name must be 2-30 characters") private String name; @Email(message = "Email must be valid") private String email; @Min(value = 18, message = "Age must be at least 18") private Integer age; // getters and setters public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } @PostMapping public ResponseEntity<String> createUser(@RequestBody @Valid UserDTO user) { return ResponseEntity.ok("User " + user.getName() + " created successfully"); } }
Always add @Valid before the DTO parameter in controller methods to trigger validation.
Validation errors automatically return HTTP 400 with messages explaining what is wrong.
You can customize error messages using the message attribute in annotations.
DTO validation checks input data early to keep your app safe and clean.
Use annotations on DTO fields and @Valid in controllers to enable validation.
Spring Boot handles errors and responses for invalid data automatically.
Practice
Solution
Step 1: Understand DTO role
A DTO (Data Transfer Object) carries data between processes and needs validation to ensure data is correct.Step 2: Purpose of validation
Validation checks input data early to prevent bad data from reaching business logic or database.Final Answer:
To check and ensure input data meets rules before processing -> Option DQuick Check:
DTO validation = input data check [OK]
- Confusing validation with database optimization
- Thinking validation generates UI
- Mixing validation with authentication
Solution
Step 1: Understand annotations meaning
@NotNull only checks for null, but allows empty strings. @NotEmpty checks for both null and empty strings.Step 2: Choose correct annotation
To ensure a field is neither null nor empty, @NotEmpty is the best choice.Final Answer:
@NotEmpty -> Option BQuick Check:
@NotEmpty = no null or empty [OK]
- Using @NotNull but allowing empty strings
- Confusing @Valid with field validation
- Using @Size without min value
public class UserDTO {
@NotNull
private String username;
@Min(18)
private int age;
// getters and setters
}What happens if a request sends
username=null and age=16 when validated with @Valid?Solution
Step 1: Check username validation
@NotNull on username means null value is invalid, so username=null fails validation.Step 2: Check age validation
@Min(18) means age must be at least 18. Given age=16, this fails validation.Final Answer:
Validation fails for both username and age fields -> Option AQuick Check:
@NotNull + @Min(18) fail for null and age 16 [OK]
- Assuming int fields can't fail validation
- Ignoring @NotNull effect on String
- Thinking validation passes if one field is valid
@PostMapping("/users")
public ResponseEntity<String> addUser(UserDTO user) {
// save user
return ResponseEntity.ok("User added");
}Solution
Step 1: Check parameter annotations
To validate JSON input as DTO, @RequestBody is needed to bind request body to UserDTO.Step 2: Check validation annotation
@Valid is also needed to trigger validation, but missing @RequestBody causes binding failure first.Final Answer:
Missing @RequestBody annotation on UserDTO parameter -> Option CQuick Check:
@RequestBody needed for JSON binding [OK]
- Forgetting @RequestBody causes no binding
- Thinking @Valid alone binds JSON
- Assuming return type must be void
Solution
Step 1: Understand nested validation
Spring Boot requires @Valid on nested DTO fields to trigger validation of inner objects.Step 2: Why @Valid on nested field
@NotNull only checks presence, but @Valid triggers validation of nested object's fields.Final Answer:
Add @Valid annotation on the nested DTO field inside the parent DTO -> Option AQuick Check:
@Valid on nested field triggers inner validation [OK]
- Using only @NotNull on nested DTO
- Assuming parent @Valid covers nested fields
- Skipping @Valid and expecting automatic nested validation
