多源映射时指定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
相关产品推荐
相关产品推荐

