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

多源映射时指定orderId取特定源值的MapStruct编译问题

解决MapStruct多源映射中orderId重复映射的编译错误

当你用MapStruct把TransactionRequestDto和CC5Response两个源对象映射到TransactionResponseDto时,因为两个源都有orderId字段,MapStruct会尝试自动将两个源的orderId都赋值给目标字段,触发编译错误:Target property "orderId" must not be mapped more than once。要让目标orderId取TransactionRequestDto的值,只需要做以下修改:

你的代码里多写了一行针对cc5Response.orderId的忽略映射,这会导致同一个目标字段被重复定义映射规则。直接删除这行忽略代码,保留显式指定request.orderId到目标orderId的映射即可——当你显式指定了目标字段的映射来源后,MapStruct会自动跳过其他源对象中同名字段的自动映射,不会再出现重复赋值的问题。

修正后的代码如下:

@Mapping(source = "cc5Response.response", target = "assecoResponse")
@Mapping(source = "cc5Response.procReturnCode", target = "resultCode")
@Mapping(source = "cc5Response.errMsg", target = "resultMessage")
@Mapping(source = "cc5Response.authCode", target = "authorization.authCode")
@Mapping(source = "cc5Response.hostRefNum", target = "authorization.hostReference")
@Mapping(source = "cc5Response.transId", target = "authorization.transId")
@Mapping(source = "request.orderId", target = "orderId") // 仅使用request中的orderId
@Mapping(source = "request.requestReference", target = "requestReference")
@Mapping(source = "request.financialGroupId", target = "financialGroupId")
@Mapping(source = "request.pos", target = "pos")
@Mapping(source = "request.transaction", target = "transaction")
@Mapping(source = "request.campaignType", target = "campaignType")
@Mapping(source = "request.campaign", target = "campaign")
@Mapping(source = "request.sale", target = "sale")
@Mapping(source = "request.additionalParameters", target = "additionalParameters")
TransactionResponseDto toResponse(TransactionRequestDto request, CC5Response cc5Response);

如果需要更明确地控制自动映射行为,也可以用@BeanMapping的unmappedSourceProperties参数,指定忽略CC5Response中的orderId字段:

@BeanMapping(unmappedSourceProperties = {"orderId"}, source = "cc5Response")
@Mapping(source = "cc5Response.response", target = "assecoResponse")
@Mapping(source = "cc5Response.procReturnCode", target = "resultCode")
@Mapping(source = "cc5Response.errMsg", target = "resultMessage")
@Mapping(source = "cc5Response.authCode", target = "authorization.authCode")
@Mapping(source = "cc5Response.hostRefNum", target = "authorization.hostReference")
@Mapping(source = "cc5Response.transId", target = "authorization.transId")
@Mapping(source = "request.orderId", target = "orderId")
@Mapping(source = "request.requestReference", target = "requestReference")
// 其他映射规则...
TransactionResponseDto toResponse(TransactionRequestDto request, CC5Response cc5Response);

第一种方法更简洁,完全能满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:25:37