MapStruct无法识别Lombok Builder,编译报错:ReferenceGroup无可用构造方法
MapStruct无法识别Lombok @Builder编译错误解决
编译错误
ReferenceGroup does not have an accessible constructor.
相关代码
Mapper接口方法
@Mapping(source = "groups", target = "nestedGroups") @Mapping(source = "references", target = "nestedReferences") net.gencat.transversal.espaidoc.domain.model.reference.ReferenceGroup toDomainModel( ReferenceGroup referenceGroup);
ReferenceGroup实体类
@Getter public class ReferenceGroup { private final List<NestedGroup> nestedGroups; private final List<NestedReference> nestedReferences; @Builder private ReferenceGroup(List<NestedGroup> nestedGroups, List<NestedReference> nestedReferences) { // 构造方法具体实现 } }
Maven编译插件配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org-mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </dependency> </annotationProcessorPaths> <compilerArgs> </compilerArgs> </configuration> </plugin>
问题背景
ReferenceGroup没有公开构造方法,仅通过Lombok的@Builder生成私有构造和Builder类。测试代码里能正常调用该Builder,但MapStruct编译时无法识别,抛出构造方法不可访问的错误。另外项目中存在ReferenceGroupPathBuilder类,需确认是否影响MapStruct对Builder的识别。
解决办法
- 升级MapStruct版本:MapStruct 1.4及以上版本对Lombok Builder的支持更成熟,检查
${org-mapstruct.version}是否低于1.4,建议升级到1.4.x或更高稳定版。 - 调整注解处理器顺序:在
annotationProcessorPaths里把lombok放在mapstruct-processor前面,确保Lombok先生成Builder代码,MapStruct后续能正确识别。 - 显式指定MapStruct使用Builder:在Mapper方法上添加
@BeanMapping(builder = @Builder),强制MapStruct使用Builder来创建实例:@Mapping(source = "groups", target = "nestedGroups") @Mapping(source = "references", target = "nestedReferences") @BeanMapping(builder = @Builder) net.gencat.transversal.espaidoc.domain.model.reference.ReferenceGroup toDomainModel( ReferenceGroup referenceGroup); - 排查ReferenceGroupPathBuilder干扰:检查该类是否与
ReferenceGroup.Builder存在类名冲突或类路径覆盖问题,确保MapStruct能找到正确的Builder类。 - 更新lombok-mapstruct-binding版本:当前使用的0.2.0版本较老,建议升级到最新稳定版(如0.2.1),提升两者的兼容性。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

