使用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
相关产品推荐
相关产品推荐

