为映射找到不明确的映射方法 属性
Ambiguous mapping methods found for mapping property
我有两个域实体:
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 知道使用哪种方法?
这里没有最具体的方法,因为您正试图映射到 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
,然后注释另一个方法。然后你每次都需要选择一个方法。
我有两个域实体:
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 知道使用哪种方法?
这里没有最具体的方法,因为您正试图映射到 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
,然后注释另一个方法。然后你每次都需要选择一个方法。