1. Configuration in Microservice
For MapStruct to function properly within a Spring Boot microservices architecture, both the parent and sub-module pom.xml
files must be correctly configured:
Parent pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
Sub-Module pom.xml
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
2. Private Variable Declaration on DTO and Entity
All fields in DTOs and entities should be declared private
to enforce encapsulation and maintain JavaBean standards. This also ensures compatibility with tools like MapStruct and Jackson.
Use Lombok to generate getters/setters:
@Data
public class MemberDTO {
private UUID id;
private String email;
// ... other fields
}
@Entity
@Data
public class Member {
@Id
private UUID id;
private String email;
// ... other fields
}
3. MapStruct Potential Bug to Access Private Member Value
Problem Description
MapStruct may silently fail or generate incomplete mapping code if:
-
Fields are private
-
No getters/setters are found
-
Annotation processing is disabled or misconfigured
How to Debug Mapping Issues
Step 1: Open the Autogenerated Mapper Implementation
Navigate to:
/target/generated-sources/annotations/...
Visually confirm whether the generated class uses:
member.setEmail(memberDTO.getEmail());
Or fails with direct field access like:
member.email = memberDTO.email; // will fail for private fields
Step 2: Manually Add Getters/Setters if Needed
If @Data
or @Getter/@Setter
does not work due to annotation processing issues, define them manually in both MemberDTO
and Member
.
Step 3: Rebuild Project
Use:
./mvnw clean compile
Or IntelliJ’s Build > Rebuild Project
with annotation processing enabled.
Step 4: Write Proper Test Code
Write integration or unit tests that validate mapping end-to-end:
@Test
void testMemberDTOtoMember() {
MemberDTO dto = MemberDTO.builder().email("test@example.com").build();
Member member = memberMapper.memberDTOtoMember(dto);
assertEquals("test@example.com", member.getEmail());
}
This ensures that future source code changes do not silently break mapping logic.