Bird
Raised Fist0
Spring Bootframework~20 mins

MapStruct for automatic mapping in Spring Boot - Practice Problems & Coding Challenges

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
Challenge - 5 Problems
🎖️
MapStruct Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this MapStruct mapping?
Given the following MapStruct mapper interface and classes, what will be the value of target.name after mapping?
Spring Boot
public class Source {
    private String name;
    public Source(String name) { this.name = name; }
    public String getName() { return name; }
}

public class Target {
    private String name;
    public void setName(String name) { this.name = name; }
    public String getName() { return name; }
}

@Mapper
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);
    Target sourceToTarget(Source source);
}

// Usage:
Source source = new Source("Alice");
Target target = MyMapper.INSTANCE.sourceToTarget(source);
String result = target.getName();
A"Alice"
Bnull
CCompilation error
D"source.name"
Attempts:
2 left
💡 Hint
MapStruct automatically maps properties with the same name and compatible types.
📝 Syntax
intermediate
1:30remaining
Which MapStruct annotation is required to define a mapper interface?
You want to create a MapStruct mapper interface to convert between two classes. Which annotation must you use on the interface?
A@Mapper
B@Component
C@Service
D@Repository
Attempts:
2 left
💡 Hint
MapStruct uses a special annotation to generate mapper implementations.
🔧 Debug
advanced
2:30remaining
Why does this MapStruct mapping fail to compile?
Consider this mapper interface: @Mapper public interface UserMapper { UserDto toDto(User user); } User and UserDto have fields with different names: User has 'firstName', UserDto has 'givenName'. No additional configuration is provided. Why does MapStruct fail to generate the implementation?
AMapStruct requires all fields to be public for mapping.
BMapStruct only supports mapping between classes with identical field types.
CMapStruct cannot map fields with different names without explicit @Mapping annotations.
DMapStruct needs a default constructor in the mapper interface.
Attempts:
2 left
💡 Hint
MapStruct matches fields by name by default.
state_output
advanced
2:00remaining
What is the output of this MapStruct mapping with nested objects?
Given these classes: public class Address { private String city; public Address(String city) { this.city = city; } public String getCity() { return city; } } public class User { private String name; private Address address; public User(String name, Address address) { this.name = name; this.address = address; } public String getName() { return name; } public Address getAddress() { return address; } } public class UserDto { private String name; private String city; public void setName(String name) { this.name = name; } public void setCity(String city) { this.city = city; } public String getName() { return name; } public String getCity() { return city; } } @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(source = "address.city", target = "city") UserDto userToUserDto(User user); } // Usage: User user = new User("Bob", new Address("Paris")); UserDto dto = UserMapper.INSTANCE.userToUserDto(user); String output = dto.getCity();
ACompilation error
Bnull
C"address.city"
D"Paris"
Attempts:
2 left
💡 Hint
MapStruct supports nested property mapping with dot notation.
🧠 Conceptual
expert
3:00remaining
Which statement about MapStruct's generated mapper implementations is true?
Choose the correct statement about how MapStruct generates mapper implementations in a Spring Boot project.
AMapStruct requires manual implementation of all mapping methods despite the interface definition.
BMapStruct generates implementations at compile time, creating simple, fast code without reflection.
CMapStruct uses runtime reflection to map fields dynamically, which slows down performance.
DMapStruct only works with XML configuration files to define mappings.
Attempts:
2 left
💡 Hint
Think about when MapStruct creates the code for mapping.

Practice

(1/5)
1. What is the main purpose of using MapStruct in a Spring Boot application?
easy
A. To create user interface components
B. To manage database connections
C. To automatically map data between different object types
D. To handle HTTP requests and responses

Solution

  1. Step 1: Understand MapStruct's role

    MapStruct is a tool designed to copy data between objects automatically, reducing manual coding.
  2. Step 2: Compare with other options

    Options A, B, and C relate to other parts of Spring Boot, not object mapping.
  3. Final Answer:

    To automatically map data between different object types -> Option C
  4. Quick Check:

    MapStruct = automatic object mapping [OK]
Hint: MapStruct = automatic copying between objects [OK]
Common Mistakes:
  • Confusing MapStruct with database or web handling
  • Thinking MapStruct creates UI components
  • Assuming MapStruct manages HTTP requests
2. Which annotation is used to define a MapStruct mapper interface in Spring Boot?
easy
A. @Component
B. @Mapper
C. @Service
D. @Repository

Solution

  1. Step 1: Identify the correct MapStruct annotation

    MapStruct uses @Mapper to mark interfaces for automatic mapping generation.
  2. Step 2: Understand Spring stereotypes

    @Component, @Service, and @Repository are Spring annotations for beans but not for MapStruct mapping.
  3. Final Answer:

    @Mapper -> Option B
  4. Quick Check:

    MapStruct interface = @Mapper [OK]
Hint: MapStruct interfaces use @Mapper annotation [OK]
Common Mistakes:
  • Using @Component instead of @Mapper
  • Confusing Spring stereotypes with MapStruct annotations
  • Omitting the @Mapper annotation
3. Given the following mapper interface:
@Mapper(componentModel = "spring")
public interface UserMapper {
    UserDto toDto(User user);
}

What happens when you inject UserMapper in a Spring Boot service and call toDto(user)?
medium
A. It converts the User object to a UserDto automatically
B. It throws a NullPointerException because no implementation exists
C. It returns the original User object without changes
D. It requires manual implementation to work

Solution

  1. Step 1: Understand componentModel = "spring"

    This setting tells MapStruct to generate a Spring bean implementation automatically.
  2. Step 2: Effect of calling toDto(user)

    The generated implementation copies matching fields from User to UserDto automatically.
  3. Final Answer:

    It converts the User object to a UserDto automatically -> Option A
  4. Quick Check:

    componentModel spring = auto bean + mapping [OK]
Hint: componentModel spring means auto Spring bean mapper [OK]
Common Mistakes:
  • Thinking manual implementation is needed
  • Assuming it returns original object
  • Expecting runtime errors without implementation
4. Consider this mapper interface:
@Mapper
public interface ProductMapper {
    ProductDto toDto(Product product);
}

When you try to inject ProductMapper in a Spring Boot service, you get an error. What is the likely cause?
medium
A. Missing componentModel = "spring" to register mapper as a Spring bean
B. The method name toDto is invalid
C. MapStruct does not support mapping Product to ProductDto
D. The interface must be a class, not an interface

Solution

  1. Step 1: Check mapper registration in Spring context

    Without componentModel = "spring", MapStruct does not create a Spring bean for the mapper.
  2. Step 2: Understand injection failure

    Spring cannot inject the mapper because it is not registered as a bean, causing an error.
  3. Final Answer:

    Missing componentModel = "spring" to register mapper as a Spring bean -> Option A
  4. Quick Check:

    Missing spring componentModel = no bean injection [OK]
Hint: Add componentModel spring to enable Spring bean injection [OK]
Common Mistakes:
  • Thinking method name causes error
  • Believing MapStruct can't map certain classes
  • Confusing interface with class requirement
5. You have two classes:
public class Employee {
    private String name;
    private int age;
    private String department;
    // getters and setters
}

public class EmployeeDto {
    private String name;
    private int age;
    // getters and setters
}

You want to map Employee to EmployeeDto using MapStruct but ignore the department field. Which mapper method signature and annotation is correct?
hard
A. @Mapper public interface EmployeeMapper { EmployeeDto toDto(Employee employee); }
B. @Mapper(componentModel = "spring") public interface EmployeeMapper { EmployeeDto toDto(Employee employee); }
C. @Mapper public interface EmployeeMapper { @Mapping(source = "department", target = "department") EmployeeDto toDto(Employee employee); }
D. @Mapper(componentModel = "spring") public interface EmployeeMapper { @Mapping(target = "department", ignore = true) EmployeeDto toDto(Employee employee); }

Solution

  1. Step 1: Identify ignoring a field in MapStruct

    To ignore a field during mapping, use @Mapping(target = "fieldName", ignore = true) on the method.
  2. Step 2: Check componentModel for Spring bean

    Using componentModel = "spring" allows Spring to manage the mapper bean automatically.
  3. Final Answer:

    @Mapper(componentModel = "spring") public interface EmployeeMapper { @Mapping(target = "department", ignore = true) EmployeeDto toDto(Employee employee); } -> Option D
  4. Quick Check:

    Ignore field with @Mapping(target, ignore=true) + spring bean [OK]
Hint: Use @Mapping(target, ignore=true) to skip fields [OK]
Common Mistakes:
  • Not using @Mapping to ignore fields
  • Forgetting componentModel = "spring" for bean
  • Incorrectly mapping ignored fields