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
MapStruct for automatic mapping in Spring Boot
📖 Scenario: You are building a Spring Boot application that manages user data. You want to convert between UserEntity objects from the database and UserDTO objects used in your API responses. Doing this manually is repetitive and error-prone.MapStruct is a tool that automatically generates code to map between these two types, saving time and avoiding mistakes.
🎯 Goal: Build a simple MapStruct mapper interface that converts between UserEntity and UserDTO classes automatically.
📋 What You'll Learn
Create a UserEntity class with fields id, name, and email.
Create a UserDTO class with the same fields.
Create a MapStruct mapper interface called UserMapper.
Add a method to map from UserEntity to UserDTO.
Add a method to map from UserDTO to UserEntity.
💡 Why This Matters
🌍 Real World
In real applications, converting between database entities and API data transfer objects is common. MapStruct automates this conversion, saving time and reducing errors.
💼 Career
Knowing how to use MapStruct is valuable for Java developers working with Spring Boot, as it improves code quality and productivity in backend development.
Progress0 / 4 steps
1
Create UserEntity class
Create a Java class called UserEntity with private fields Long id, String name, and String email. Include public getters and setters for each field.
Spring Boot
Hint
Define a public class named UserEntity. Add private fields for id, name, and email. Then add public getter and setter methods for each field.
2
Create UserDTO class
Create a Java class called UserDTO with private fields Long id, String name, and String email. Include public getters and setters for each field.
Spring Boot
Hint
Define a public class named UserDTO. Add private fields for id, name, and email. Then add public getter and setter methods for each field.
3
Create UserMapper interface with MapStruct
Create a MapStruct mapper interface called UserMapper. Annotate it with @Mapper. Add a method UserDTO toDto(UserEntity userEntity) to map from UserEntity to UserDTO. Add a method UserEntity toEntity(UserDTO userDTO) to map from UserDTO to UserEntity.
Spring Boot
Hint
Define an interface named UserMapper. Add the @Mapper annotation above it. Inside, add two methods: one to convert UserEntity to UserDTO, and another to convert UserDTO to UserEntity.
4
Complete MapStruct setup with componentModel
Modify the @Mapper annotation on UserMapper to include componentModel = "spring". This allows Spring Boot to detect and inject the mapper automatically.
Spring Boot
Hint
Update the @Mapper annotation to @Mapper(componentModel = "spring"). This tells MapStruct to generate a Spring bean for the mapper.
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
Step 1: Understand MapStruct's role
MapStruct is a tool designed to copy data between objects automatically, reducing manual coding.
Step 2: Compare with other options
Options A, B, and C relate to other parts of Spring Boot, not object mapping.
Final Answer:
To automatically map data between different object types -> Option C
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
Step 1: Identify the correct MapStruct annotation
MapStruct uses @Mapper to mark interfaces for automatic mapping generation.
Step 2: Understand Spring stereotypes
@Component, @Service, and @Repository are Spring annotations for beans but not for MapStruct mapping.
Final Answer:
@Mapper -> Option B
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
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
Step 1: Understand componentModel = "spring"
This setting tells MapStruct to generate a Spring bean implementation automatically.
Step 2: Effect of calling toDto(user)
The generated implementation copies matching fields from User to UserDto automatically.
Final Answer:
It converts the User object to a UserDto automatically -> Option A
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
Step 1: Check mapper registration in Spring context
Without componentModel = "spring", MapStruct does not create a Spring bean for the mapper.
Step 2: Understand injection failure
Spring cannot inject the mapper because it is not registered as a bean, causing an error.
Final Answer:
Missing componentModel = "spring" to register mapper as a Spring bean -> Option A
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
Step 1: Identify ignoring a field in MapStruct
To ignore a field during mapping, use @Mapping(target = "fieldName", ignore = true) on the method.
Step 2: Check componentModel for Spring bean
Using componentModel = "spring" allows Spring to manage the mapper bean automatically.
Final Answer:
@Mapper(componentModel = "spring")
public interface EmployeeMapper {
@Mapping(target = "department", ignore = true)
EmployeeDto toDto(Employee employee);
} -> Option D
Quick Check:
Ignore field with @Mapping(target, ignore=true) + spring bean [OK]
Hint: Use @Mapping(target, ignore=true) to skip fields [OK]