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

MapStruct嵌套对象映射异常:OrderInvoice属性未映射问题求助

问题描述

尝试设置包含自定义类EventPayload的InvoiceDocument属性时,EventPayload中的基本类型可正常映射,但其中的OrderInvoice属性始终为null。源对象中OrderInvoice是List类型,而目标对象中是单个对象。已编写单独的映射方法,但不知如何关联它们。

相关映射代码
@BeanMapping(ignoreByDefault = true)
@Mapping(target = "eventPayload", source = "baseRequest.invoice.eventPayload")
InvoiceDocument createInvoiceDocument(PaymentTriggerBaseModel baseRequest);

@Mapping(target = "orderInvoice", source ="baseRequest.invoice.eventPayload.orderInvoices", qualifiedByName="firstElement")
OrderInvoice createEventPayload(PaymentTriggerBaseModel baseRequest);

@Named("firstElement")
default OrderInvoice map(List<com.sams.oms.ng.common.models.payment.request.OrderInvoice> value) {
    if(value == null) return null;
    if(value.isEmpty()) return null;
    return mapInvoice(value.get(0));
}

abstract com.sams.oms.ng.common.models.payment.cosmos.OrderInvoice mapInvoice(com.sams.oms.ng.common.models.payment.request.OrderInvoice invoice); 
POJO类定义
public class InvoiceDocument {
private EventPayload eventPayload;
}

public class EventPayload{
private String customerId;
private String enterpriseCode;
private OrderInvoice orderInvoice;
}

public class OrderInvoice {
private String invoiceNo;
private String invoiceType;
}
报错信息
java: Unmapped target property: "orderInvoice". Mapping from property "Order baseRequest.invoice.eventPayload" to "EventPayload eventPayload".
解决方案

问题核心在于当前映射配置未明确指定源EventPayload到目标EventPayload的完整转换逻辑,导致MapStruct无法处理orderInvoice属性的映射。调整步骤如下:

  1. 新增EventPayload专用映射方法:明确定义源EventPayload到目标EventPayload的所有属性映射,指定从orderInvoices列表取第一个元素映射到orderInvoice。
  2. 复用已有列表转单个对象逻辑:保留你编写的firstElement命名方法和mapInvoice方法。

修改后的完整映射代码:

@BeanMapping(ignoreByDefault = true)
@Mapping(target = "eventPayload", source = "baseRequest.invoice.eventPayload")
InvoiceDocument createInvoiceDocument(PaymentTriggerBaseModel baseRequest);

// 新增:源EventPayload到目标EventPayload的映射方法
@BeanMapping(ignoreByDefault = true)
@Mapping(target = "customerId", source = "customerId")
@Mapping(target = "enterpriseCode", source = "enterpriseCode")
@Mapping(target = "orderInvoice", source = "orderInvoices", qualifiedByName = "firstElement")
EventPayload mapEventPayload(com.sams.oms.ng.common.models.payment.request.EventPayload sourceEventPayload);

@Named("firstElement")
default com.sams.oms.ng.common.models.payment.cosmos.OrderInvoice mapFirstElement(List<com.sams.oms.ng.common.models.payment.request.OrderInvoice> value) {
    if (value == null || value.isEmpty()) {
        return null;
    }
    return mapInvoice(value.get(0));
}

abstract com.sams.oms.ng.common.models.payment.cosmos.OrderInvoice mapInvoice(com.sams.oms.ng.common.models.payment.request.OrderInvoice invoice);

说明

  • 原createEventPayload方法返回类型为OrderInvoice,无法用于EventPayload的整体映射,因此替换为mapEventPayload方法专门处理源到目标EventPayload的转换。
  • 当createInvoiceDocument映射eventPayload属性时,MapStruct会自动调用mapEventPayload方法,完成包括orderInvoice在内的所有属性映射。
  • qualifiedByName="firstElement"会触发你定义的列表取第一个元素的逻辑,将源的orderInvoices列表转换为目标的单个orderInvoice对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:26:05