MapStruct Debug in Microservice

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.

Leave a Comment

Your email address will not be published. Required fields are marked *