【问题标题】:MapStruct @MappingTarget generates an empty methodMapStruct @MappingTarget 生成一个空方法
【发布时间】:2020-02-08 00:36:59
【问题描述】:

有一个目标类型,由 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


    【解决方案1】:

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

    Mapper 特别希望声明 Lombok 的 @Data 而不是 @Value(原以为 MapStruct 可以使用 @Builder),因此需要从字段中删除 final,这需要更新。

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

    【讨论】:

    • 能否详细说明?
    • 和我想的一样。 lombok 和 mapstruct 关系比较粗。
    • MapStruct 不关心来自 Lombok 的任何注释。它依赖于 Lombok 正确公开方法的事实。对于这个特殊问题,请查看github.com/rzwitserloot/lombok/issues/1538
    【解决方案2】:

    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 一起使用。

    【讨论】:

    • 最终得到了类似的答案(我认为,有点过时的问题)。不过谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多