MapStruct映射歧义问题:如何通过方法参数指定JPA属性映射?
解决MapStruct映射歧义问题的方案
问题原因
当你定义了两个同输入(CandidateRecommendationJpa)同输出(CandidateRecommendation)的映射方法时,MapStruct在处理集合映射(比如List<CandidateRecommendationJpa>转List<CandidateRecommendation>)时,无法自动判断应该调用哪个方法,因此抛出歧义错误。
解决方法
方法1:用@Named标记方法并指定集合映射逻辑
给每个单元素映射方法加上@Named注解标记唯一名称,然后在集合映射方法上通过@IterableMapping(qualifiedByName = "xxx")明确指定要使用的方法:
import org.mapstruct.Named; import org.mapstruct.IterableMapping; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper public interface CandidateRecommendationMapper { // 标记接收方映射方法 @Named("toReceiverModel") @Mapping(source = "candidateReceiver", target = "candidate") CandidateRecommendation toModel(CandidateRecommendationJpa jpa); // 标记发送方映射方法 @Named("toSenderModel") @Mapping(source = "candidateSender", target = "candidate") CandidateRecommendation toSenderModel(CandidateRecommendationJpa jpa); // 集合映射指定用接收方方法 @IterableMapping(qualifiedByName = "toReceiverModel") List<CandidateRecommendation> toReceiverModelList(List<CandidateRecommendationJpa> jpaList); // 集合映射指定用发送方方法 @IterableMapping(qualifiedByName = "toSenderModel") List<CandidateRecommendation> toSenderModelList(List<CandidateRecommendationJpa> jpaList); }
方法2:跨实体映射时直接指定方法
如果是在其他实体的映射逻辑中需要调用这两个方法,可通过@Mapping的qualifiedByName属性指定具体使用哪个方法:
@Mapping(source = "recommendations", target = "receiverRecommendations", qualifiedByName = "toReceiverModel") @Mapping(source = "recommendations", target = "senderRecommendations", qualifiedByName = "toSenderModel") OtherModel mapToOtherModel(OtherJpa jpa);
额外提示
如果不想用@Named,也可以自定义@Qualifier注解来标记方法,效果和@Named一致,只是需要自己定义注解类,步骤稍多,一般@Named足够满足需求。
内容的提问来源于stack exchange,提问作者Dragg
相关产品推荐
相关产品推荐

