将 Mapstruct 上下文包含到内部映射器中

Include Mapstruct context into internal mappers

我正在使用 MapStruct 1.3.0.Final 将 Dto 转换为 POJO,反之亦然,将 spring 值转换为 mapstruct.defaultComponentModel选项。为了避免由于双向关系导致的计算器错误,我遵循了下一个 link:

Mapping With Cycles

但是,编译阶段(生成实现)花费了很多时间(大约 15 分钟只有 20 个文件,我需要包含更多文件)。

我不能 "reuse" 现有的映射器,因为我不能 "send" 那么上下文使用:

@Mapper(uses=B_Mapper.class)
A_Mapper ...

那么,是否有优化选项可以减少所需时间?有没有办法将上下文传递到 "internal mappers"(在上面的示例中 B_Mapper)?

更新

这是应用程序的骨架:

public class EntityA {
  ...
  @OneToMany(mappedBy="entityA")
  private List<EntityB> entitiesB;
  ...
}

public class EntityB {
  ...
  @ManyToOne
  private EntityA entityA;
  ...
}

DTO:

public class DtoA { 
  ...
  private List<DtoB> dtosB;
  ...
}

public class DtoB { 
  ...
  private DtoA dtoA;
  ...
}

还有很多"columns and bidirectional relations"几个entities/dtos。

转换器:

public interface BaseConverter<D, E> {

  E fromDtoToEntity(final D dto, @Context CycleAvoidingMappingContext context);

  // This is the method I really use for the conversions
  @Named("originalFromDtoToEntity")
  default E fromDtoToEntity(final D dto) {
    return fromDtoToEntity(dto, new CycleAvoidingMappingContext());
  }
  ...
}

@Mapper
public interface AConverter extends BaseConverter<DtoA, EntityA>{}

@Mapper
public interface BConverter extends BaseConverter<DtoB, EntityB>{}

查看您的转换器,这意味着如果您使用它们,CycleAvoidingContext 已经通过。例如:

@Mapper(uses = BConverter.class, componentModel = "spring")
public interface AConverter extends BaseConverter<DtoA, EntityA>{}

@Mapper(uses = AConverter.class, componentModel = "spring")
public interface BConverter extends BaseConverter<DtoB, EntityB>{}

然后在调用它时 MapStruct 将正确调用 fromDtoToEntity 并在那里传递 CycleAvoidingContext

请记住spring componentModel,由于映射器之间的循环依赖性,无法使用默认设置。