You need to enable JavaScript to run this app. Mapstruct无法识别Lombok的@SuperBuilder提示无可用构造函数如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Mapstruct无法识别Lombok的@SuperBuilder提示无可用构造函数如何解决

问题根因
  • 你定义的UserDto、StudentDto仅配置了@SuperBuilder与@Getter注解,没有对外暴露可访问的构造方法,且所有字段都用final修饰没有setter方法,MapStruct默认无法找到合法的Dto实例化路径,因此抛出构造方法不可访问的错误。
  • 缺少Lombok与MapStruct的桥接依赖,且注解处理器执行顺序配置错误时,MapStruct编译阶段无法识别Lombok生成的Builder相关代码,也会触发该报错。
最优解决方案(保留Dto不可变特性)

不需要修改现有Dto的不可变设计,只要调整构建配置即可,步骤如下:

  1. 添加桥接依赖并调整注解处理器顺序
    要让Lombok的注解处理先于MapStruct执行,且通过桥接包让MapStruct能识别Lombok生成的Builder代码。
    以Maven为例,修改maven-compiler-plugin配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <annotationProcessorPaths>
            <!-- 顺序不能变:先Lombok,再桥接包,最后MapStruct -->
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</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>${mapstruct.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

如果是Gradle项目,按以下顺序添加注解处理器依赖即可:

annotationProcessor 'org.projectlombok:lombok:${lombokVersion}'
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
annotationProcessor 'org.mapstruct:mapstruct-processor:${mapstructVersion}'
  1. 确认Dto注解配置无需修改
    保留原有@Getter、@SuperBuilder注解和final字段即可,不需要额外添加构造方法或者setter,完全符合不可变设计要求:
@Getter
@SuperBuilder
public class UserDto {
    private final String name;
}

@Getter
@SuperBuilder
public class StudentDto extends UserDto {
    private final int grade;
}
  1. Mapper代码无需调整
    MapStruct 1.3+版本会自动识别Lombok生成的Builder实现,自动使用Builder构造Dto实例并完成父类、子类字段的映射,原有Mapper代码可以直接复用:
@Mapper(componentModel = "spring")
public interface StudentMapper extends GenericMapper<StudentDto, Student> {
}

内容的提问来源于stack exchange,提问作者Shinbop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 08:00:04