首页 > 解决方案 > 将 Mapstruct 上下文包含到内部映射器中

问题描述

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

用循环映射

但是,编译阶段(生成实现)需要很多时间(大约 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>{}

标签: springmapstruct

解决方案


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


推荐阅读