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属性的映射。调整步骤如下:
- 新增EventPayload专用映射方法:明确定义源EventPayload到目标EventPayload的所有属性映射,指定从
orderInvoices列表取第一个元素映射到orderInvoice。 - 复用已有列表转单个对象逻辑:保留你编写的
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
相关产品推荐
相关产品推荐

