MapStruct @MappingTarget 生成一个空方法

问题描述 投票:0回答:3

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

@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

java lombok mapstruct
3个回答
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>

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

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


1
投票

好吧,结果变成了 Lombok + 私人决赛。

Mapper 特别希望声明 Lombok 的

@Data
而不是
@Value
(原以为
@Builder
可供 MapStruct 使用),因此需要从所需字段中删除
final
待更新。

奇怪的是,这是通过“google,错误并重试”完成的(加上每次尝试时都从项目中手动清除

out
目录,因为 MapStruct 忽略了这些更改),而 MapStruct 从未发出警告(没有标记忽略已声明的警告或错误)。


0
投票

我知道我迟到了,我已经有了 lombok-mapstruct-binding ,但我仍然不得不通过使用 @Data 而不是 @Value 来使我的实体可变,因为它刚刚创建了映射器绑定对于显式设置器,毕竟没有使用构建器。

这只发生在我想用 @MappingTarget 后填充实体时。

© www.soinside.com 2019 - 2024. All rights reserved.