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

使用MapStruct映射分层Bean:继承类与CustomerDO转换扩展问题

用MapStruct实现CustomerDO到Customer子类的多态映射

嗨,这需求我熟!MapStruct刚好支持这种基于类型标识的多态对象映射,咱们一步步来实现:

1. 先确保项目引入MapStruct依赖

如果用Maven,在pom.xml里添加这些(版本可以用最新稳定版):

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.5.Final</version>
    <scope>provided</scope>
</dependency>

2. 完善实体类与DO类结构

先补全类的基础属性(假设属性名一致,MapStruct会自动映射):

// 父类Customer
public class Customer {
    private String id;
    private String name;
    // getter、setter省略
}

// 零售客户子类
public class RetailCustomer extends Customer {
    private Integer maxPurchaseLimit;
    // getter、setter省略
}

// 批发客户子类
public class WholeSaleCustomer extends Customer {
    private Double discountRate;
    // getter、setter省略
}

// 数据传输对象CustomerDO
public class CustomerDO {
    private String custType; // 取值比如"RETAIL"或"WHOLESALE"
    private String id;
    private String name;
    private Integer maxPurchaseLimit; // 对应RetailCustomer的独有属性
    private Double discountRate; // 对应WholeSaleCustomer的独有属性
    // getter、setter省略
}

3. 实现CustomerMapper接口

用MapStruct的@SubclassMapping注解指定不同custType对应的目标子类,同时定义子类的具体映射方法:

import org.mapstruct.Mapper;
import org.mapstruct.SubclassMapping;

@Mapper
public interface CustomerMapper {

    // 核心多态映射方法:根据custType自动匹配子类
    @SubclassMapping(source = "RETAIL", target = RetailCustomer.class)
    @SubclassMapping(source = "WHOLESALE", target = WholeSaleCustomer.class)
    Customer toCustomer(CustomerDO customerDO);

    // 映射到RetailCustomer的具体方法(MapStruct编译时自动实现)
    RetailCustomer toRetailCustomer(CustomerDO customerDO);

    // 映射到WholeSaleCustomer的具体方法(MapStruct编译时自动实现)
    WholeSaleCustomer toWholeSaleCustomer(CustomerDO customerDO);
}

4. 关键注解说明

  • @Mapper:标记这是MapStruct映射器接口,编译阶段会自动生成实现类。
  • @SubclassMapping:指定当custType的值等于source时,将CustomerDO映射到target指定的子类。注意要保证custType的取值和source字符串完全匹配(如果是枚举类型,直接用枚举常量即可)。
  • 子类映射方法:MapStruct会自动处理父类属性的继承映射,同时把CustomerDO中对应子类的独有属性也自动映射,不需要额外编写重复代码。

5. 业务代码调用示例

在业务逻辑中注入CustomerMapper(比如Spring环境下用@Autowired),直接调用toCustomer方法即可:

@Autowired
private CustomerMapper customerMapper;

public void processCustomer(CustomerDO customerDO) {
    Customer customer = customerMapper.toCustomer(customerDO);
    // 根据实际类型做后续业务处理
    if (customer instanceof RetailCustomer) {
        RetailCustomer retailCustomer = (RetailCustomer) customer;
        // 处理零售客户专属逻辑
    } else if (customer instanceof WholeSaleCustomer) {
        WholeSaleCustomer wholeSaleCustomer = (WholeSaleCustomer) customer;
        // 处理批发客户专属逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:50:31