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

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

说明

  1. MapStruct会自动识别集合类型的映射(如List<PageData>到List<Data>),只要提供单个元素的映射方法(pageDataToData)
  2. 对于字段名完全匹配的对象(如PageInfo和Page),无需添加@Mapping注解,MapStruct会自动完成属性拷贝
  3. 字段名不一致的对象(如Bag和Wallet),需要显式指定字段映射关系

内容的提问来源于stack exchange,提问作者sudarshan.spectrum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:52:14