MapStruct中@SubclassMapping能否与子类@Mapping结合使用?
MapStruct子类映射父类字段未自动填充的注解化解决方案
针对你遇到的父类id字段未自动映射、添加@Mapping注解触发编译错误的问题,以下是无需为每个子类重复编写自定义映射的注解化解决方案:
核心思路
利用MapStruct的@InheritConfiguration注解让子类映射继承父类的字段映射规则,结合@SubclassMapping实现统一的多态映射入口,同时适配Java Record不可继承的特性(每个子类DTO需显式声明父类字段)。
步骤1:定义DTO Record(适配Record不可继承特性)
由于Java Record无法继承,每个子类DTO需显式包含父类DateRule的id字段,同时添加自身特有的字段:
// 基础父类DTO(可选,用于统一多态返回类型) public record DateRuleDto(Long id) {} // 子类DTO:年度日期规则 public record AnnualDateRuleDto(Long id, LocalDate fixedDate) {} // 子类DTO:星期规则 public record DayOfWeekRuleDto(Long id, DayOfWeek targetDay) {}
步骤2:编写映射接口(继承父类映射规则)
通过@InheritConfiguration让子类映射继承父类的id字段映射规则,避免重复编写;用@SubclassMapping配置多态映射的类型匹配:
import org.mapstruct.InheritConfiguration; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.SubclassMapping; @Mapper(componentModel = "spring") // 按需选择组件模型,如spring、cdi等 public interface DateRuleMapper { // 父类基础映射:定义id字段的映射规则 @Mapping(target = "id", source = "id") DateRuleDto mapBase(DateRule dateRule); // 子类映射:继承父类的id映射规则,仅需添加子类特有字段的映射 @InheritConfiguration(name = "mapBase") @Mapping(target = "fixedDate", source = "annualDate") AnnualDateRuleDto map(AnnualDateRule rule); @InheritConfiguration(name = "mapBase") @Mapping(target = "targetDay", source = "dayOfWeek") DayOfWeekRuleDto map(DayOfWeekRule rule); // 统一多态入口:自动根据源对象类型匹配对应映射方法 @SubclassMapping(source = AnnualDateRule.class, target = AnnualDateRuleDto.class) @SubclassMapping(source = DayOfWeekRule.class, target = DayOfWeekRuleDto.class) DateRuleDto mapToDto(DateRule dateRule); }
关键说明
@InheritConfiguration的作用:指定继承父类映射方法的配置,自动复用id字段的映射规则,无需在每个子类映射中重复编写@Mapping(target = "id", source = "id")。@SubclassMapping的作用:配置多态映射的类型对应关系,调用mapToDto方法时,MapStruct会根据传入的DateRule子类实例,自动调用对应的子类映射方法。- Lombok兼容性:已引入的
lombok-mapstruct-binding会确保MapStruct能正确识别Lombok生成的getter方法,无需手动编写字段访问逻辑。
编译错误排查
如果之前添加@Mapping触发编译错误,通常是因为:
- 父类映射方法与子类
@SubclassMapping的配置冲突,未明确指定继承关系; - DTO Record未显式声明
id字段,导致MapStruct无法找到目标字段。
按上述方案调整后,即可解决编译错误并自动映射父类id字段。
内容的提问来源于stack exchange,提问作者Jermeel
相关产品推荐
相关产品推荐

