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

时间:2019-03-04 09:44:24

标签: spring mapstruct

我正在使用MapStruct 1.3.0.Final将Dto转换为POJO,反之亦然,将 spring 值转换为 mapstruct.defaultComponentModel 选项。为了避免由于双向关系引起的堆栈溢出错误,我遵循了下一个链接:

Mapping With Cycles

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

我无法“重用”现有的映射器,因为我无法使用以下方式“发送”然后使用上下文:

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

那么,是否有优化选择来减少所需的时间?有没有办法将上下文传递到“内部映射器”(在上面的示例中是 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;
  ...
}

在几个实体/ dto中还有更多的“列和双向关系”。

转换器:

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>{}

1 个答案:

答案 0 :(得分:1)

查看转换器,这意味着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,由于映射器之间存在循环依赖性,因此无法使用默认值。