微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mapstruct 似乎无法识别 Lombok 的 @SuperBuilder

如何解决Mapstruct 似乎无法识别 Lombok 的 @SuperBuilder

我有两个这样的领域类。

@Getter
@Setter
public class User {
    private String name;
}
@Getter
@Setter
public class Student extends User {
    private int grade;
}

我也有两个这样的 Dto 类。

@Getter
@SuperBuilder
public class UserDto {
    private final String name;
}
@Getter
@SuperBuilder
public class StudentDto extends UserDto {
    private final int grade;
}

所以我创建了一个映射器类 StudentMapper,它扩展了 GenericMapper。

public interface GenericMapper<D,E> {
    D toDto(E e);
    E toEntity(D d);
}
@Mapper(componentModel = "spring")
public interface StudentMapper extends GenericMapper<StudentDto,Student> {
}

但是我在编译 Mapper 时出错。

“StudentDto 没有可访问的构造函数。”

这些代码有什么问题?

我希望 StudentD 是不可修改的。 使用 lombok 和 mapstruct 到达那里的最佳方式是什么?

您可以从这里获取代码https://github.com/jangdaewon/sandbox.lombokmapstruct

解决方法

这有点违反直觉,但 Lombok 必须放在注解处理器列表中的 mapstruct 之后。 Mapstruct 检测 Lombok 并等待 Lombok 完全完成其工作(Lombok 可能需要几轮注释处理)。

因此,只需像这样更改 <configuration>maven-compiler-pluginpom.xml 中处理器的顺序:

<annotationProcessorPaths>
    <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
    </path>
    <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </path>
    <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok-mapstruct-binding</artifactId>
        <version>${lombok-mapstruct-binding.version}</version>
    </path>
</annotationProcessorPaths>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。