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

Mapstruct似乎无法识别Lombok的@SuperBuilder

庄星汉
2023-03-14

我有两个这样的域类。

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

这些代码有什么问题?

我希望学生是不可修改的。使用lombok和mapstruct的最佳方式是什么?

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

共有1个答案

柴宏浚
2023-03-14

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

因此,只需在< code >中更改处理器的顺序

<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>
 类似资料:
  • 我在scala项目中使用Flyway版本5.2.4,并且我的所有迁移脚本都在src/main/Resources/db/迁移下,具有以下文件夹结构 位置设置为db.migrations(没有任何前缀。Flyway留档表示如果不使用前缀,则支持sql/java迁移) V1和V2似乎没有问题。但是V3被忽略了。我尝试添加V3\uu java\u迁移。java也一样,它没有什么不同。是否有人有幸添加了非

  • 我有一个非常简单的超文本标记语言文件,其中有一个按钮。当单击此按钮时,函数loadDoc()在javascript文件(ajax.js)中运行。带有IDajax_text的div被更改为“单击”。到目前为止还不错。 现在,我试图对一个php文档进行ajax调用。php文档应该响应“Hello World!”。我试图通过使用警报(alert(msg))来显示此消息。php文档与我的HTML文档位于同

  • 假设我们在外部工件中有一个接口,我们无法更改: 以及此接口的一个实现,具有对应于父接口的更多成员。Lombok生成的getters/setters不能被编译器识别,所以我必须添加实际的getter方法来使下面的类可编译。 编译错误是接口方法未实现时的标准错误: my.package.测试实现不是抽象的,并且不会覆盖TestInterface中my.package.抽象方法isTest() 假设Lo

  • 在简单使用lombok、IDE(如Netbeans)的过程中,Intellij允许使用lombok库注入的方法,例如@Getter 代码返回this.getVar()不被Test类识别。但是如果我们使用另一个类,例如Test2,在这种情况下我们可以使用getter方法。 环境: Netbeans 8.0.2 龙目岛1.16.13 Jdk 1.7 项目类型Java应用程序

  • 我正在使用Mapstruct 1.3.0投影这个源对象; 进入本DTO: 在我的界面中,我没有为字段“noMappingDefined”定义任何映射 在构建项目时,将POM中的compilerArgs中的UnappedTargetPolicy设置为WARN不会导致任何通知,并且在Mapstruct生成的目标类中找不到没有映射的字段。 生成的类没有像预期的那样包括未映射的字段,但是我希望在构建项目时

  • 我试图使用IntelliJ2017 Ultimate构建/运行一个使用MapStruct的Spring Boot应用程序。这是一个分级项目。我的问题是IntelliJ似乎没有运行MapStruct注释处理器。我意识到我可以配置IntelliJ来委托Gradle构建过程(请参见此),但我希望简单地配置IntelliJ来使用APT来生成必要的类本身。 我已经为我的项目启用了APT,但是我的类仍然没有生