找到用于映射属性的模糊映射方法

时间:2018-04-26 01:46:48

标签: java mapstruct

我有两个域实体:

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。这是因为当我获得一份商业清单时,我想要完整的业务,但是当我获得一个身份时,我就会知道它的基本信息是什么。

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

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知道使用哪种方法?

1 个答案:

答案 0 :(得分:2)

此处没有最具体的方法,因为您尝试映射到Set<BaseDto>

您可以使用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,然后注释另一个方法。那么你每次都需要选择一种方法。