MapStruct @MappingTarget 生成一个空方法

App*_*ler 5 java lombok mapstruct

有一个由 Lombok 形成的目标类型:

@Data
@Builder
class Target {
   private final String a;
}
Run Code Online (Sandbox Code Playgroud)

并有一个 DTO:

@Value
@Builder
class DTO {
   private final String a;
}
Run Code Online (Sandbox Code Playgroud)

映射器:

@Mapper(componentModel = "spring")
interface Mapper {
    void update(DTO dto, @MappingTarget Target target);
}
Run Code Online (Sandbox Code Playgroud)

但是当我编译时(看到一些与 JDK 11 相关的东西,是的,在我的例子中是 11),编译后的方法是空的:

public void update(DTO source, Target target) {
   if (source == null) {
       return;
   }
}
Run Code Online (Sandbox Code Playgroud)

并且这只与MappingTarget相关。使用“createFromDTO”的常规映射方法可以正常工作。

地图结构1.3.0

Dan*_*ana 5

Maven只使用Mapstruct处理器,那么你需要在pom.xml中添加Maven插件,配置Mapstruct与Lombok处理器一起使用。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <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>0.1.0</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

您不需要包含 Final 修饰符。如前所述,使用 @Data 而不是 @Value。

在我的测试中,这足以让 Mapstruct 1.4.1.Final 与 Lombok 和 JDK 11 配合使用。