当前位置: 首页 > 知识库问答 >
问题:

如何指导Mapstruct使用lombok Builder?

汪欣德
2023-03-14

当我试图用一个私有的默认构造函数映射对象时,MapStruct无法创建一个实现,而是使用一个(lombok生成的)构建器。

@Value
@Builder
public class SomeDto {
}
@Value
@Builder
public class SomeModel {
}
@Mapper
public interface SomeMapper {
    SomeDto map(SomeModel someModel);
    SomeModel map(SomeDto someDto);
}
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${compiler-plugin.version}</version>
        <configuration>
            <annotationProcessorPaths>
                <path>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>1.18.16</version>
                </path>
                <path>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok-mapstruct-binding</artifactId>
                    <version>0.2.0</version>
                </path>
                <path>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <version>1.4.1.Final</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
    </plugin>
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-01-29T13:47:46+0100",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.9.1 (Ubuntu)"
)
public class SomeMapperImpl implements SomeMapper {

    @Override
    public SomeDto map(SomeModel someModel) {
        if ( someModel == null ) {
            return null;
        }

        SomeDto someDto = new SomeDto();

        return someDto;
    }

    @Override
    public SomeModel map(SomeDto someDto) {
        if ( someDto == null ) {
            return null;
        }

        SomeModel someModel = new SomeModel();

        return someModel;
    }
}

为了重现这个问题,复制这个repo https://github.com/rmvanderspek/mapstruct-demo和mvn verify。

共有1个答案

贺亦
2023-03-14

我已经使用了您的演示源码,结果发现将Mapstruct放在编译器插件源码中可以解决这个问题。我不知道为什么这样做,这对我来说是违反直觉的,但这是Mapstruct的一名开发人员在Lombok的GitHub上发布的类似问题中提出的建议。

所以在你的情况下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${compiler-plugin.version}</version>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${org.mapstruct.mapstruct-processor.version}</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${org.projectlombok.lombok.version}</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-mapstruct-binding</artifactId>
                <version>${org.projectlombok.ombok-mapstruct-binding.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>
    
 类似资料:
  • 问题内容: 如果名称和名称相同,默认情况下MapStruct将映射源和目标的所有属性。尽管我们可以在@Mapping中使用ignore属性来省略任何字段映射。但这不是我想要的。我想控制映射策略。我必须指定类似 现在此映射仅用于将ID和名称从源映射到目标。除非在映射注释中指定,否则不应映射其他字段。 问题答案: 您正在寻找的是#1392中 的功能请求。有一个待定的PR,因此可以在下一版本(1.3.0

  • 默认情况下,MapStruct映射源和目标的所有属性,如果它们具有相同的名称。中的元素可用于省略任何字段映射。但那不是我想要的。我想控制映射策略。我想指定如下内容: 现在,这个映射仅仅意味着将id和名称从源映射到目的地。除非在mappings注释中指定,否则不应映射其他字段。

  • 我有简单的对象客户端

  • 我的映射器: parsedunsignedshort 所以你可以在上面看到触发器在“源”中是一个ParsedUnsignedShort,在“目标”中是一个Long。在我得到这个的时候,有一个名字冲突: 错误:(42,6)Java:无法将属性“cat.tmatic.mh.domain.pl6xx.ParseDunSignedShort触发器”映射到“java.lang.Long触发器”。考虑声明/实

  • Android Studio正在使用这个JDK位置:C:\Program Files\Android\Android Studio\JRE,这与Gradle默认使用的不同:C:\Program Files(x86)\Java\JDK1.8.0_181如果使用Android Studio从命令行运行Gradle任务,使用不同的位置可能会产生多个Gradle守护进程。 然后给出了这些选项: 详细信息.

  • 这是我的例子。 我希望toDto方法使用toDto将Employee映射到EmployeeDto,但mapstruct会生成employeeDtoToEmployeeDto方法。我该怎么修? 谢谢