将 Mapstruct 上下文包含到内部映射器中
Include Mapstruct context into internal mappers
我正在使用 MapStruct 1.3.0.Final 将 Dto 转换为 POJO,反之亦然,将 spring 值转换为 mapstruct.defaultComponentModel选项。为了避免由于双向关系导致的计算器错误,我遵循了下一个 link:
但是,编译阶段(生成实现)花费了很多时间(大约 15 分钟只有 20 个文件,我需要包含更多文件)。
我不能 "reuse" 现有的映射器,因为我不能 "send" 那么上下文使用:
@Mapper(uses=B_Mapper.class)
A_Mapper ...
那么,是否有优化选项可以减少所需时间?有没有办法将上下文传递到 "internal mappers"(在上面的示例中 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;
...
}
还有很多"columns and bidirectional relations"几个entities/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>{}
查看您的转换器,这意味着如果您使用它们,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
,由于映射器之间的循环依赖性,无法使用默认设置。
我正在使用 MapStruct 1.3.0.Final 将 Dto 转换为 POJO,反之亦然,将 spring 值转换为 mapstruct.defaultComponentModel选项。为了避免由于双向关系导致的计算器错误,我遵循了下一个 link:
但是,编译阶段(生成实现)花费了很多时间(大约 15 分钟只有 20 个文件,我需要包含更多文件)。
我不能 "reuse" 现有的映射器,因为我不能 "send" 那么上下文使用:
@Mapper(uses=B_Mapper.class)
A_Mapper ...
那么,是否有优化选项可以减少所需时间?有没有办法将上下文传递到 "internal mappers"(在上面的示例中 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;
...
}
还有很多"columns and bidirectional relations"几个entities/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>{}
查看您的转换器,这意味着如果您使用它们,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
,由于映射器之间的循环依赖性,无法使用默认设置。