Mapstruct映射处理器空指针异常求助(JDK11+Lombok)
MapStruct编译时NullPointerException排查与解决
问题场景
执行mvn clean install编译时触发MapStruct映射处理器内部错误:
java.lang.NullPointerException at org.mapstruct.ap.internal.model.common.Type.hasAccessibleConstructor(Type.java:1078)
错误定位到Sports.java文件,涉及的类为父类Sports和子类Football,环境信息:
- lombok: 1.18.30
- org.mapstruct.version: 1.4.2.Final
- JDK 11
- Intellij 2023.2.5 Community Edition
原因分析
MapStruct 1.4.2.Final版本与Lombok的@SuperBuilder注解存在兼容性缺陷:
- 子类
Football仅标注@SuperBuilder,未配套提供明确的构造器,也未正确继承父类的Builder结构; - 父类
Sports同时使用@NoArgsConstructor、@AllArgsConstructor和@SuperBuilder,导致Lombok生成的Builder元数据不符合MapStruct处理器的预期,在检查类的可访问构造器时出现空引用,触发NPE。
解决方法
1. 升级MapStruct版本(推荐)
MapStruct 1.5.0及以上版本修复了大量与Lombok Builder相关的兼容性问题,建议升级至最新稳定版,修改pom.xml中的依赖版本:
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
2. 修正Lombok注解配置(不升级版本时适用)
调整子类Football的注解,确保类具备明确的构造器或正确继承父类Builder:
- 方案一:给
Football添加构造器注解@Data @SuperBuilder @NoArgsConstructor @AllArgsConstructor public class Football extends Sports { } - 方案二:优化父类与子类的
@SuperBuilder配置// Sports类 @Data @NoArgsConstructor @AllArgsConstructor @SuperBuilder(toBuilder = true) @Jacksonized @EqualsAndHashCode public class Sports { private String name; private String foundation_year; } // Football类 @Data @SuperBuilder(builderMethodName = "builder", toBuilder = true) public class Football extends Sports { }
3. 确保编译时处理器顺序正确
在maven-compiler-plugin中指定注解处理器顺序,让Lombok先完成代码生成,再由MapStruct处理:
<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> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </path> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </path> </annotationProcessorPaths> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Mohamed Mamun
相关产品推荐
相关产品推荐

