首页 > 解决方案 > Mapstruct 中的 CycleAvoidingMapperContext 清理

问题描述

在 Mapstruct 讨论和示例中,引入了 CycleAvoidingMapperContext 用法,以实际避免循环依赖。

@Component
public class CycleAvoidingMappingContext {
    private Map<Object, Object> knownInstances = new IdentityHashMap<Object, Object>();

    @BeforeMapping
    public <T> T getMappedInstance(Object source, @TargetType Class<T> targetType) {
        return (T) knownInstances.get( source );
    }

    @BeforeMapping
    public void storeMappedInstance(Object source, @MappingTarget Object target) {
        knownInstances.put( source, target );
    }
}

我的映射器使用 componentModel = "spring",上面的上下文在 "uses" 部分中指定,因此在代码生成后,上下文将自动装配,所有必要的检查都在 Impl 类中创建。

提出了以下问题:何时清理/重新创建上下文?映射器存储在应用程序的配置类中,所以我猜上下文也会一直“活着”,并且在所有映射之后它变得太大并且包含无效实体。虽然我希望它在单个地图调用期间“活着”。

例如,有 Entity1(在 uses 部分有上下文),它有 Entity2 字段,它再次链接到 Entity1。我希望在每个顶级 Entity1 映射之前初始化上下文,以避免 Entity1.Entity2.Entity1 映射期间的循环依赖。并且可以在映射完成后进行清理。

那么,关于上下文 HashMap 清理的实际逻辑是什么以及如何防止其重载?

标签: javamapstruct

解决方案


您所指的示例是mapstruct-mapping-with-cycles 的一部分,在那里它不用作 Spring bean。

的想法CycleAvoidingMapperContext是用作@Context属性。

每次将它传递给映射方法时,您都会创建一个新实例。


推荐阅读