Bird
Raised Fist0
Spring Bootframework~5 mins

Validation groups in Spring Boot

Choose your learning style10 modes available

Start learning this pattern below

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
Introduction

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.

When you want to validate user input differently for creating and updating data.
When you have a form with optional sections that require different validations.
When you want to apply stricter checks in some cases but relaxed checks in others.
When you want to reuse the same object but validate only some fields in certain flows.
Syntax
Spring Boot
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.

Examples
Two groups are defined: CreateGroup and UpdateGroup. The username is required only when creating, but email is required in both cases.
Spring Boot
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;
}
This method validates the user object only for the CreateGroup rules.
Spring Boot
@Validated(CreateGroup.class)
public void createUser(@Valid User user) {
    // validation applies only for CreateGroup
}
Sample Program

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.

Spring Boot
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());
    }
}
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. What is the main purpose of using validation groups in Spring Boot?
easy
A. To automatically generate validation error messages
B. To group multiple objects for batch validation
C. To disable validation temporarily
D. To apply different validation rules to the same object based on context

Solution

  1. Step 1: Understand validation groups concept

    Validation groups allow applying different sets of validation rules to the same object depending on the situation.
  2. Step 2: Compare with other options

    Grouping objects or disabling validation are not the purpose of validation groups. Generating messages is separate.
  3. Final Answer:

    To apply different validation rules to the same object based on context -> Option D
  4. Quick Check:

    Validation groups = Different rules per context [OK]
Hint: Validation groups separate rules by use case [OK]
Common Mistakes:
  • Thinking groups batch multiple objects
  • Assuming groups disable validation
  • Confusing groups with error message generation
2. Which of the following is the correct way to define a validation group interface in Spring Boot?
easy
A. @Group public interface CreateGroup {}
B. public class CreateGroup {}
C. public interface CreateGroup {}
D. interface CreateGroup extends Validation {}

Solution

  1. Step 1: Recall validation group definition

    Validation groups are defined as empty interfaces without annotations or inheritance.
  2. 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.
  3. Final Answer:

    public interface CreateGroup {} -> Option C
  4. Quick Check:

    Groups = empty interfaces [OK]
Hint: Groups are simple empty interfaces [OK]
Common Mistakes:
  • Using classes instead of interfaces
  • Adding unnecessary annotations
  • Extending unrelated interfaces
3. Given the code snippet:
@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)?
medium
A. Only the id field is validated for not null
B. Only the name field is validated for not null
C. Both name and id fields are validated for not null
D. No fields are validated because groups are ignored

Solution

  1. Step 1: Understand group-based validation

    When validating with CreateGroup.class, only constraints assigned to that group run.
  2. Step 2: Check which fields have CreateGroup

    The name field has @NotNull(groups = CreateGroup.class), so it is validated. The id field belongs to UpdateGroup, so it is skipped.
  3. Final Answer:

    Only the name field is validated for not null -> Option B
  4. Quick Check:

    Validate CreateGroup = only name checked [OK]
Hint: Validate with group runs only matching group constraints [OK]
Common Mistakes:
  • Assuming all fields validate regardless of group
  • Confusing group names
  • Ignoring group parameter in validation
4. Consider this validation setup:
@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)?
medium
A. Because email is in the Default group, not AdminGroup
B. Because @NotNull is ignored in groups
C. Because role is not validated
D. Because @Validated does not support groups

Solution

  1. Step 1: Identify groups assigned to fields

    The email field uses the Default group, while role uses AdminGroup.
  2. Step 2: Understand validation group filtering

    When validating with AdminGroup.class, only constraints in that group run. email is skipped because it belongs to Default.
  3. Final Answer:

    Because email is in the Default group, not AdminGroup -> Option A
  4. Quick Check:

    Validation group filters constraints [OK]
Hint: Default group constraints don't run if validating other groups [OK]
Common Mistakes:
  • Assuming Default group always validates
  • Thinking @NotNull ignores groups
  • Believing @Validated ignores groups
5. You want to validate a user object differently when creating and updating. You have CreateGroup and UpdateGroup. How do you apply validation groups to a Spring Boot controller method to validate only the create rules?
hard
A. Use @Validated(CreateGroup.class) on the method parameter
B. Use @Valid without groups on the method parameter
C. Use @Validated without parameters on the method parameter
D. Use @Validated(UpdateGroup.class) on the method parameter

Solution

  1. Step 1: Recall how to specify validation groups

    To validate with a specific group, use @Validated(GroupName.class) on the method parameter.
  2. Step 2: Match group to desired validation

    For create rules, use CreateGroup.class. Using @Valid or @Validated without parameters runs default group only.
  3. Final Answer:

    Use @Validated(CreateGroup.class) on the method parameter -> Option A
  4. Quick Check:

    Specify group in @Validated to run that group's rules [OK]
Hint: Add group class to @Validated to run specific validations [OK]
Common Mistakes:
  • Using @Valid which ignores groups
  • Omitting group class in @Validated
  • Using wrong group class for validation