映射器没有使用另一个映射器,如何使用另一个映射器的映射器?

Mapper is not using another mapper, how to use a mapper from another mapper?

我正在试验 MapStruct,我想让一个映射器使用另一个映射器将多个对象组合成一个。对于我的测试,我有三个域对象,DomainObject1DomainObject2DomainObject3。我想将 DomainObject1 转换为一个 DTO,TransferObjectA,它有一个字段包含第二个 DTO,TransferObjectB,它是使用 DomainObject2DomainObject3 构造的。

我有两个映射器,一个将 DomainObject2DomainObject3 转换为 TransferObjectB,它会忽略 DomainObject2 中的一个字段,因此它不会被转换:

@Mapper
public interface ObjectBMapper {

  @Mapping(target = "field1", ignore = true)
  TransferObjectB domainObject2ToTransferObjectB(DomainObject2 domainObject2, DomainObject3 domainObject3);
}

还有一个将 DomainObject1 转换为 TransferObjectA 的映射器,它也接受 DomainObject2DomainObject3 所以它们可以使用上面的映射器转换并放在结果上TransferObjectA:

@Mapper(uses = ObjectBMapper.class)
public interface ObjectAMapper {

  TransferObjectA domainObject1ToTransferObjectA(DomainObject1 domainObject1, DomainObject2 domainObject2, DomainObject3 domainObject3);
}

然而,ObjectBMapper 似乎没有被 ObjectAMapper 使用并且 field1 被转换(这导致错误,因为它是一个 enum).为什么 ObjectBMapper 未被使用,我如何确保 ObjectAMapper 将使用它?

MapStruct 目前只能使用具有单个源参数的其他映射器。有一个关于此功能的开放功能请求 mapstruct/mapstruct#2081

您可以做的是使用包装器对象而不是多个源参数。