Mapstruct编译报错找不到source属性roleIds的原因及解决方法
问题原因
- 注解处理器执行顺序不兼容:你当前使用的MapStruct 1.4.1.Final版本与Lombok的注解处理器默认执行顺序冲突,MapStruct扫描类属性时,Lombok还未完成
UserFilterDto类的getter/setter方法生成,导致MapStruct无法识别roleIds属性。 - RoleMapper存在语法错误:你贴出的
RoleMapper代码末尾多了一个多余的闭合花括号},会导致类编译异常,也可能影响MapStruct的依赖扫描。 - (可选触发项)若
UserFilter类与UserMapper不在同一个包下,你定义的UserFilter没有加public修饰符,会导致MapStruct无法访问该类的属性。
修复方案
步骤1:修复RoleMapper语法错误
修正后的RoleMapper代码如下:
@Mapper public interface RoleMapper { default List<Role> roleIdListToRoleList(List<Long> roleIds) { return Objects.isNull(roleIds) ? Lists.newArrayList() : roleIds.stream().map(id -> Role.builder().id(id).build()).collect(Collectors.toList()); } }
步骤2:新增Lombok与MapStruct的绑定依赖
在pom.xml的maven-compiler-plugin的annotationProcessorPaths中加入lombok-mapstruct-binding依赖,协调两个注解处理器的执行顺序,调整后的配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>11</source> <target>11</target> <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>0.2.0</version> </path> </annotationProcessorPaths> <compilerArgs> <compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg> </compilerArgs> </configuration> </plugin>
步骤3:(可选)升级MapStruct版本
将pom.xml中的mapstruct.version升级到1.5.5.Final及以上,新版本对Lombok的适配性更好,可减少兼容问题。
步骤4:(可选)修正UserFilter的访问权限
若UserFilter和UserMapper不在同一包下,给UserFilter添加public修饰符:
@Data @Builder public class UserFilter { private String username; private Boolean isEnabled; private List<Role> roles; }
完成以上修改后,执行mvn clean compile重新编译即可生成符合预期的Mapper实现代码。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

