Validation groups help you apply different validation rules to the same data depending on the situation. This way, you can reuse your validation logic but change what is checked.
Validation groups in Spring Boot
Start learning this pattern below
Jump into concepts and practice - no test required
public interface GroupName {}
@Validated(GroupName.class)
public class YourClass {
@NotNull(groups = GroupName.class)
private String field;
}Define empty interfaces to represent groups.
Use groups attribute in validation annotations to assign them to groups.
CreateGroup and UpdateGroup. The username is required only when creating, but email is required in both cases.public interface CreateGroup {}
public interface UpdateGroup {}
public class User {
@NotNull(groups = CreateGroup.class)
private String username;
@NotNull(groups = {CreateGroup.class, UpdateGroup.class})
private String email;
}CreateGroup rules.@Validated(CreateGroup.class) public void createUser(@Valid User user) { // validation applies only for CreateGroup }
This example shows a User class with two validation groups: CreateGroup and UpdateGroup. The username is required only when creating a user. The email is required in both create and update. The main method validates two users with different groups and prints how many violations each has.
import jakarta.validation.constraints.*; import jakarta.validation.*; import org.springframework.validation.annotation.Validated; import java.util.Set; public class ValidationGroupsExample { public interface CreateGroup {} public interface UpdateGroup {} public static class User { @NotNull(groups = CreateGroup.class) private String username; @NotNull(groups = {CreateGroup.class, UpdateGroup.class}) private String email; public User(String username, String email) { this.username = username; this.email = email; } // getters and setters omitted for brevity } public static void main(String[] args) { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); User userForCreate = new User(null, "user@example.com"); User userForUpdate = new User(null, null); Set<ConstraintViolation<User>> createViolations = validator.validate(userForCreate, CreateGroup.class); Set<ConstraintViolation<User>> updateViolations = validator.validate(userForUpdate, UpdateGroup.class); System.out.println("Create group violations: " + createViolations.size()); System.out.println("Update group violations: " + updateViolations.size()); } }
Validation groups let you control which validations run in different situations.
Always define groups as empty interfaces for clarity.
Use the groups attribute on validation annotations to assign them to groups.
Validation groups help apply different validation rules to the same object.
Define groups as empty interfaces and assign validations to them.
Use the validator with a specific group to run only those validations.
Practice
validation groups in Spring Boot?Solution
Step 1: Understand validation groups concept
Validation groups allow applying different sets of validation rules to the same object depending on the situation.Step 2: Compare with other options
Grouping objects or disabling validation are not the purpose of validation groups. Generating messages is separate.Final Answer:
To apply different validation rules to the same object based on context -> Option DQuick Check:
Validation groups = Different rules per context [OK]
- Thinking groups batch multiple objects
- Assuming groups disable validation
- Confusing groups with error message generation
Solution
Step 1: Recall validation group definition
Validation groups are defined as empty interfaces without annotations or inheritance.Step 2: Analyze options
public interface CreateGroup {} correctly defines an empty interface. public class CreateGroup {} uses class, which is incorrect. @Group public interface CreateGroup {} uses a non-existent annotation. interface CreateGroup extends Validation {} extends a non-required interface.Final Answer:
public interface CreateGroup {} -> Option CQuick Check:
Groups = empty interfaces [OK]
- Using classes instead of interfaces
- Adding unnecessary annotations
- Extending unrelated interfaces
@NotNull(groups = CreateGroup.class) private String name; @NotNull(groups = UpdateGroup.class) private String id;
What happens when you validate the object with
@Validated(CreateGroup.class)?Solution
Step 1: Understand group-based validation
When validating withCreateGroup.class, only constraints assigned to that group run.Step 2: Check which fields have
TheCreateGroupnamefield has@NotNull(groups = CreateGroup.class), so it is validated. Theidfield belongs toUpdateGroup, so it is skipped.Final Answer:
Only thenamefield is validated for not null -> Option BQuick Check:
Validate CreateGroup = only name checked [OK]
- Assuming all fields validate regardless of group
- Confusing group names
- Ignoring group parameter in validation
@NotNull(groups = Default.class) private String email; @NotBlank(groups = AdminGroup.class) private String role;
Why does validation fail to check
email when validating with @Validated(AdminGroup.class)?Solution
Step 1: Identify groups assigned to fields
Theemailfield uses theDefaultgroup, whileroleusesAdminGroup.Step 2: Understand validation group filtering
When validating withAdminGroup.class, only constraints in that group run.emailis skipped because it belongs toDefault.Final Answer:
Becauseemailis in the Default group, not AdminGroup -> Option AQuick Check:
Validation group filters constraints [OK]
- Assuming Default group always validates
- Thinking @NotNull ignores groups
- Believing @Validated ignores groups
CreateGroup and UpdateGroup. How do you apply validation groups to a Spring Boot controller method to validate only the create rules?Solution
Step 1: Recall how to specify validation groups
To validate with a specific group, use@Validated(GroupName.class)on the method parameter.Step 2: Match group to desired validation
For create rules, useCreateGroup.class. Using@Validor@Validatedwithout parameters runs default group only.Final Answer:
Use@Validated(CreateGroup.class)on the method parameter -> Option AQuick Check:
Specify group in @Validated to run that group's rules [OK]
- Using @Valid which ignores groups
- Omitting group class in @Validated
- Using wrong group class for validation
