You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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();
}

说明

  1. 指定CompanyInformationDtoBuilder<?, ?>作为参数类型,明确这是泛型Builder而非原始类型,消除第一个警告。
  2. 由于Builder泛型已明确,调用company()方法时不会再触发未检查调用的警告。
  3. 尽量移除手动build()调用:MapStruct的@AfterMapping是在映射过程中补充字段,最终对象的构建由MapStruct负责,手动调用可能导致重复构建或不符合预期的对象状态。

内容的提问来源于stack exchange,提问作者GoodWin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:40:57