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

问题描述 投票:1回答:1

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

Mapping With Cycles

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

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

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

那么,是否有优化选项来减少所需的时间?有没有办法将上下文传递给“内部映射器”(在上面的示例B_Mapper中)?

UPDATE

这是应用程序的框架:

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;
  ...
}

在几个实体/ 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>{}
spring mapstruct
1个回答
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,由于映射器之间的循环依赖性,默认不能使用。

© www.soinside.com 2019 - 2024. All rights reserved.