Mapstruct - 映射从基 class 扩展的 DTO 时编译失败

Mapstruct - compilation failure when mapping DTOs that extend from base class

我正在尝试映射:

public class UserInfoDTO {
    private String addressDto;
}
public class B extends UserInfoDTO {
    private String roleId;
}
public class A extends UserInfoDTO {
    private String groupId;
}

来自:

public class Entity {
    private Address address;
}

地址包含一些字段和“字符串城市”字段。

我想在实体和 DTO 之间映射

@Mapper(componentModel = "jsr330")
public interface IUserMapper {
   A aFromEntity (Entity entity); 
   B bFromEntity (Entity entity); 
   
   @Mappings({
            @Mapping(target = "addressDto", source = "entity.address.city")
   })
   UserInfoDTO fromEntity (Entity entity); 
}

但是我遇到编译失败,“无法将 属性 地址映射到字符串 addressDto”。 请帮助:)

您需要将 getter 和 setter 添加到您的 类:

The general philosophy of MapStruct is to generate code which looks as much as possible as if you had written it yourself from hand. In particular this means that the values are copied from source to target by plain getter/setter invocations instead of reflection or similar.

MapStruct 1.4.1.Final Reference Guide

更新。如果您使用 Lombok 而不是 getters/setters。

在编译时不要忘记 annotationProcessorPaths,这样 Lombok 可以生成 getter 和 setter。

Maven 示例:

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>                        
                        <annotationProcessorPaths>
                            <path>
                                <groupId>org.mapstruct</groupId>
                                <artifactId>mapstruct-processor</artifactId>
                                <version>${org.mapstruct.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                                <version>${org.projectlombok.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok-mapstruct-binding</artifactId>
                                <version>${lombok-mapstruct-binding.version}</version>
                            </path>
                        </annotationProcessorPaths>
                    </configuration>
                </plugin>       
            </plugins>
        </pluginManagement>
    </build>

Gradle 例子

dependencies {
   // Lombok
   compileOnly 'org.projectlombok:lombok:1.18.2'
   annotationProcessor 'org.projectlombok:lombok:1.18.2'

   // MapStruct
   compileOnly 'org.mapstruct:mapstruct-jdk8:1.2.0.Final'
   annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'

}