spring - 将 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>{}
解决方案
查看您的转换器,这意味着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
,由于映射器之间的循环依赖关系,无法使用默认值。
推荐阅读
- zapier - Zapier CLI 动态下拉菜单,如何为 bundle.inputData 设置多个值
- angular - Angular mat-dialog 使用多个表单和模板
- r - R:在每年一月初添加一条垂直线
- python - 从对象标签中解析文本
- mysql - Docker compose for NodeJs with MySQL on AWS Elastic Beanstalk
- c# - 当我从 c# 运行 .cmd 文件时访问被拒绝
- javascript - react-fabricjs TypeError:无法读取未定义的属性'bool'
- python - 如何在 ostu 的二值化和自适应阈值处理后提取字符?
- react-native - 同时使用 AVFoundation 和 RNCamera 预览
- python-3.x - 将 tkinter 变量保存到 txt 文件错误