Mapstruct似乎无法识别Lombok的@SuperBuilder注解。

3

我有两个类似这样的域类。

@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没有可访问的构造函数。"

这些代码有什么问题吗?

我希望StudentDto是不可修改的。 使用lombok和mapstruct实现最佳方法是什么?

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


1
你能否尝试更改你的<annotationProcessorPaths>的顺序,使得Lombok成为最后一个条目? - Jan Rieke
@JanRieke 在改变 <annotationProcessorPaths> 的顺序后,错误消息已消失。谢谢。 - Shinbop
太好了。我把这个作为答案添加了上去(附带一点解释)。如果您能接受它,那就太好了。 - Jan Rieke
1个回答

5

有些违反直觉,但是在注解处理器列表中,Lombok必须放在Mapstruct之后。Mapstruct会检测Lombok,并等待Lombok完全完成其工作(Lombok可能需要多个注解处理轮次)。

所以只需像这样在pom.xmlmaven-compiler-plugin<configuration>中更改处理器的顺序:

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

1
我除了惊讶之外没有什么可说的了,有参考资料吗?它运行得很好! 如果mapstruct需要lombok,那么lombok不应该先定义吗? 这就是你提到的“违反直觉”的吗? - Implermine
这与此问题相冲突:https://dev59.com/0uk5XIcBkEYKwwoY8efo - Johannes Pertl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接