如何指示Mapstruct使用lombok builder?

How to instruct Mapstruct to use lombok builder?

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

SomeMapperImpl.java:[20,27] SomeDto() is not public in com.example.mapstructdemo.dto.SomeDto; cannot be accessed from outside package

Dto:

@Value
@Builder
public class SomeDto {
}

型号:

@Value
@Builder
public class SomeModel {
}

映射器接口:

@Mapper
public interface SomeMapper {
    SomeDto map(SomeModel someModel);
    SomeModel map(SomeDto someDto);
}

来自 Pom.xml 的片段:

    <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;
    }
}

我可以做些什么来帮助 mapstruct 找到构建器?

要重现该问题,请克隆此存储库 https://github.com/rmvanderspek/mapstruct-demo 并进行 mvn 验证。

我试过你的演示源,结果证明将 Mapstruct 放在编译器插件源中的第一个位置可以解决这个问题。我不知道为什么会这样,这对我来说是违反直觉的,但这是 Mapstruct 的一位开发人员在 a similar issue posted on Lombok's 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>
    

我将 lombok 工件放在依赖项中的 mapstruct 和 mapstruct-processor 工件下面,它开始工作了。

    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${mapstruct.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-mapstruct-binding</artifactId>
            <version>${lombok-mapstruct-binding.version}</version>
        </dependency>
    </dependencies>