如何指示Mapstruct使用lombok构建器?

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

SomeMapperImpl.java:[20,27] SomeDto() 在 com.example.mapstructdemo.dto.SomeDto 中不是公开的;无法从外部包访问

到:

@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 找到构建器?

要重现该问题,请克隆此 repo https://github.com/rmvanderspek/mapstruct-demo和 mvn verify。

回答

我玩过你的演示源代码,结果证明将 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使用lombok构建器?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>