Mapstruct无法识别Lombok的@SuperBuilder提示无可用构造函数如何解决
问题根因
- 你定义的
UserDto、StudentDto仅配置了@SuperBuilder与@Getter注解,没有对外暴露可访问的构造方法,且所有字段都用final修饰没有setter方法,MapStruct默认无法找到合法的Dto实例化路径,因此抛出构造方法不可访问的错误。 - 缺少Lombok与MapStruct的桥接依赖,且注解处理器执行顺序配置错误时,MapStruct编译阶段无法识别Lombok生成的Builder相关代码,也会触发该报错。
最优解决方案(保留Dto不可变特性)
不需要修改现有Dto的不可变设计,只要调整构建配置即可,步骤如下:
- 添加桥接依赖并调整注解处理器顺序
要让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}'
- 确认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; }
- Mapper代码无需调整
MapStruct 1.3+版本会自动识别Lombok生成的Builder实现,自动使用Builder构造Dto实例并完成父类、子类字段的映射,原有Mapper代码可以直接复用:
@Mapper(componentModel = "spring") public interface StudentMapper extends GenericMapper<StudentDto, Student> { }
内容的提问来源于stack exchange,提问作者Shinbop
相关产品推荐
相关产品推荐

