【问题标题】:Include Mapstruct context into internal mappers将 Mapstruct 上下文包含到内部映射器中
【发布时间】:2019-03-04 09:44:23
【问题描述】:

我正在使用 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)?

更新

这是应用程序的骨架:

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

【问题讨论】:

  • 15 分钟真的很慢。是否可以给我们提供一个演示这个问题的最小示例,也许我们可以找到潜在的问题。
  • 嗨 Filip,我们必须处理一个“旧数据库”,它有 30-40 列的表,其中一些是 FK 到其他列。这些关系中有很大一部分必须使用 JPA/Hibernate 映射为双向关系,从而避免该技术的性能问题。
  • 我的意思是编译时间,不管你的应用程序有多复杂,都不应该花 15 分钟。对于B_Mapper,您可以在其中使用@Context,它将被传递给它。
  • 我已经用转换器的骨架更新了这个问题。你能解释一下我如何在你所说的转换器之间传递@Context 吗?
  • 试图回答。理论上你不需要做任何事情,只要调用适当的方法,MapStruct 也会做同样的事情。对于性能,您确定只有那些转换器需要很长时间吗?我可以单独调查

标签: spring mapstruct


【解决方案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

记住springcomponentModel,由于映射器之间的循环依赖关系,默认不能使用。

【讨论】:

  • 谢谢,它就像一个魅力。我在pom.xml 文件中使用“弹簧选项”,而不是在@Mapper
  • 在 pom 中使用 spring 选项也应该可以。如果没有正确选择选项,唯一的问题可能出在 IDE 中
猜你喜欢
  • 2018-07-09
  • 2019-05-05
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2021-11-22
  • 2021-08-03
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多