MapStruct @MappingTarget生成一个空方法

时间:2019-10-10 14:17:19

标签: java lombok mapstruct

具有由龙目岛形成的目标类型:

@Data
@Builder
class Target {
   private final String a;
}

并有一个DTO:

@Value
@Builder
class DTO {
   private final String a;
}

映射器:

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

但是当我编译(看到与JDK 11相关的东西,是的,在我的情况下是11)时,编译后的方法为空:

public void update(DTO source, Target target) {
   if (source == null) {
       return;
   }
}

这仅与MappingTarget有关。使用常规的'createFromDTO'映射方法可以正常工作。

MapStruct 1.3.0

2 个答案:

答案 0 :(得分:1)

好吧,原来是龙目岛+私人决赛。

Mapper特别希望声明Lombok的@Data而不是@Value(曾认为@Builder由MapStruct使用),因此需要删除{{ 1}}中的字段,这些字段需要更新。

奇怪的是,这是通过“ google,错误并重试”完成的(每次尝试都手动从项目中清除final目录,因为MapStruct忽略了这些更改),而MapStruct从未给出警告(未声明忽略警告或错误的标志)。

答案 1 :(得分:1)

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>

您不需要包括final修饰符。如前所述,使用@data代替@value。

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