使用MapStruct时触发Sonar泛型警告:Lombok SuperBuilder原始类型问题
解决MapStruct结合Lombok SuperBuilder时的Sonar警告问题
遇到的Sonar警告
Raw use of parameterized class 'CompanyInformationDto.CompanyInformationDtoBuilder'(参数化类CompanyInformationDto.CompanyInformationDtoBuilder被原始类型使用)Unchecked call to 'company(List<Companies>)' as a member of raw type 'com.project.domain.model.company.CompanyInformationData.CompanyInformationDataBuilder'(对原始类型CompanyInformationData.CompanyInformationDataBuilder的方法company(List<Companies>)进行了未检查调用)
相关类代码
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @SuperBuilder @Getter @ToString(callSuper = true) public class CompanyInformationDto extends CompanyInformationData { } @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @SuperBuilder @Getter @ToString public class CompanyInformationData { // 省略成员变量定义 }
Mapper原代码
@AfterMapping default void afterMapping(@MappingTarget CompanyInformationDto.CompanyInformationDtoBuilder source) { // 触发第一个警告 List<Companies> companies = new ArrayList<>(); // ... 业务逻辑处理 source.company(companies).build(); // 触发第二个警告 }
解决方案
问题根源是Lombok的@SuperBuilder生成的Builder类是泛型类型,直接使用原始类型(不指定泛型参数)会触发Sonar的类型安全警告。只需给Builder指定泛型参数即可解决:
修改后的Mapper代码
@AfterMapping default void afterMapping(@MappingTarget CompanyInformationDto.CompanyInformationDtoBuilder<?, ?> source) { List<Companies> companies = new ArrayList<>(); // ... 业务逻辑处理 source.company(companies); // 注意:MapStruct通常会自动完成对象构建,无需手动调用build(),如果非必要建议移除该调用 // 若确实需要手动构建,指定泛型后警告会自动消失: // CompanyInformationDto dto = source.build(); }
说明
- 指定
CompanyInformationDtoBuilder<?, ?>作为参数类型,明确这是泛型Builder而非原始类型,消除第一个警告。 - 由于Builder泛型已明确,调用
company()方法时不会再触发未检查调用的警告。 - 尽量移除手动
build()调用:MapStruct的@AfterMapping是在映射过程中补充字段,最终对象的构建由MapStruct负责,手动调用可能导致重复构建或不符合预期的对象状态。
内容的提问来源于stack exchange,提问作者GoodWin
相关产品推荐
相关产品推荐

