java - 发现映射属性的映射方法不明确

标签 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。这是因为当我获取企业列表时,我想要完整的业务 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然后注释另一个方法。那么您每次都需要选择一种方法。

关于java - 发现映射属性的映射方法不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033652/

相关文章:

java - ProcessBuilder和Process.waitFor(),它等了多久?

java - Java Hash Map中可以存储50mb的字符串类型键值对数据吗

java - 简单的java正则表达式替换问题

java - 在不使用拆分或循环的情况下使用 IndexOf 和子字符串拆分字符串

jpa - 返回类型中的未知属性

java - 如何通过Objectify检索实体原始数据存储Key?

java - MapStruct:是否可以为某个类型的所有嵌套字段指定使用相同的命名映射?

java - 来自实体映射结构中多个字符串的 Dto

java - 映射嵌套列表

java - MapStruct 不会通过 Spring-boot 测试 Gradle Junit5 自动写入