【问题标题】:Ambiguous mapping methods found for mapping property为映射属性找到不明确的映射方法
【发布时间】:2018-04-28 16:17:29
【问题描述】:

我有两个域实体:

class Identity {
   Long id;
   Set<Business> businesses;
}

class Business {
   Long id;
   String name;
}

然后我有两个扩展基本 DTO 的 DTO:

class BaseDto {
   String id;
}

class IdentityDto extends BaseDto {
   Set<BaseDto> businesses;
}

class BusinessDto extends BaseDto {
   String name;
}

然后我创建了一个映射器,它将我的域实体列表映射到一组特定的 dto 或一组更通用的基本 dto。这是因为当我获得企业列表时,我想要完整的企业 dto,但是当我获得身份时,我只需要它的企业列表中的基本信息。

但是当我尝试为身份创建映射器时,我收到以下错误:

Ambiguous mapping methods found for mapping property
"Set<Business> businesses" to Set<BaseDto>:

Set<BusinessDto> BusinessMapper.toSet(Set<Business> businesses),
Set<BaseDto> BusinessMapper.toBaseSet(Set<Business> businesses).

我认为mapstruct使用了最具体的方法,所以应该知道在这种情况下使用toIdentifierSet方法。

如何让 mapstruct 知道使用哪种方法?

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    这里没有最具体的方法,因为您正在尝试映射到 Set&lt;BaseDto&gt;。

    您可以使用Mapping method selection based on qualifiers。

    你可以定义一些注解:

    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.CLASS)
    public @interface BaseInfo {
    }
    

    然后在你的BusinessMapper

    @Mapper
    public interface BusinessMapper {
    
        Set<BusinessDto> toSet(Set<Business> businesses);
    
        @BaseInfo
        Set<BaseDto> toBaseSet(Set<Business> businesses);
    }
    

    然后在你的标识符中

    @Mapper
    public interface IdentifierMapper {
    
        @Mapping(target = "businesses", qualifiedBy = BaseInfo.class)
        IdentityDto map(Identity source);
    }
    

    如果您想始终明确选择,您可以添加另一个注释BusinessInfo,然后注释另一个方法。那么你每次都需要选择一种方法。

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2014-06-21
      • 2017-07-23
      • 2016-02-24
      • 2015-07-09
      • 2019-02-01
      相关资源
      最近更新 更多