如何使用Mapstruct映射含嵌套数组的对象:SearchResult转PageAndData
完善MapStruct实现SearchResult到PageAndData的完整映射
目标对象(Target):PageAndData
public class PageAndData { Page page; List<Data> data; } public class Page { private int size; private int totalPages; } public class Data{ Integer id; String name; List <Wallet> wallets; } public class Wallet{ Integer walletId; String walletName; }
源对象(Source):SearchResult
public class SearchResult{ PageInfo pageInfo; List<PageData> pageData; } public class PageInfo{ private int size; private int totalPages; } public class PageData{ Integer id; String name; List<Bag> bags; } public class Bag{ Integer bagId; String bagName; }
当前部分实现
@Mapper public interface SearchResultToPageAndData{ @Mapping(source = "pageInfo", target = "info") @Mapping(source = "pageData", target = "data") PageAndData mymap(SearchResult searchResult); }
注:原代码中目标字段
info应为page,需与PageAndData类中的属性名保持一致,否则映射会失效
映射需求
需实现完整字段映射,规则如下:
- SearchResult.pageInfo.size → PageAndData.page.size
- SearchResult.pageInfo.totalPages → PageAndData.page.totalPages
- SearchResult.pageData.id → PageAndData.data.id
- SearchResult.pageData.name → PageAndData.data.name
- SearchResult.pageData.bags → PageAndData.data.wallets
- 集合元素映射:SearchResult.pageData.bags.bagId → PageAndData.data.wallets.walletId
- 集合元素映射:SearchResult.pageData.bags.bagName → PageAndData.data.wallets.walletName
示例
输入SearchResult实例
{ "pageInfo": { "size": 5, "totalPages": 10 }, "pageData": [ { "id": 1, "name": "Page101", "bags": [ { "bagId": 1, "bagName": "bagname" } ] } ] }
转换后PageAndData实例
{ "page": { "size": 5, "totalPages": 10 }, "data": [ { "id": 1, "name": "Page101", "wallets": [ { "walletId": 1, "walletName": "bagname" } ] } ] }
完整Mapper实现
@Mapper public interface SearchResultToPageAndData { // 主映射方法:SearchResult → PageAndData @Mapping(source = "pageInfo", target = "page") @Mapping(source = "pageData", target = "data") PageAndData mymap(SearchResult searchResult); // 子映射:PageInfo → Page(字段名完全匹配,无需额外@Mapping) Page pageInfoToPage(PageInfo pageInfo); // 子映射:PageData → Data,指定bags到wallets的映射 @Mapping(source = "bags", target = "wallets") Data pageDataToData(PageData pageData); // 子映射:Bag → Wallet,指定字段映射 @Mapping(source = "bagId", target = "walletId") @Mapping(source = "bagName", target = "walletName") Wallet bagToWallet(Bag bag); }
说明
- MapStruct会自动识别集合类型的映射(如
List<PageData>到List<Data>),只要提供单个元素的映射方法(pageDataToData) - 对于字段名完全匹配的对象(如PageInfo和Page),无需添加@Mapping注解,MapStruct会自动完成属性拷贝
- 字段名不一致的对象(如Bag和Wallet),需要显式指定字段映射关系
内容的提问来源于stack exchange,提问作者sudarshan.spectrum
相关产品推荐
相关产品推荐

