Очистка CycleAvoidingMapperContext в Mapstruct - PullRequest
0 голосов
/ 25 октября 2018

В обсуждениях и примерах 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", указанный выше контекст указан в разделе "using", поэтому после генерации кода контекст автоматически подключается, и все необходимые проверки создаются в классе Impl.

Был задан следующий вопрос: когда контекст очищается / воссоздается?Сопоставитель хранится в классе конфигурации приложения, поэтому я предполагаю, что контекст также будет "жить" все это время, и он станет слишком большим и будет содержать недопустимые объекты после всех сопоставлений.В то время как я ожидал, что он будет «жить» во время одиночного вызова карты.

Например, есть Entity1 (с контекстом в разделе использования), который имеет поле Entity2, которое снова связано с Entity1.Я ожидаю, что контекст будет инициализироваться перед каждым отображением Entity1 верхнего уровня, чтобы избежать зависимости цикла во время отображения Entity1.Entity2.Entity1.И его можно очистить после завершения сопоставления.

Итак, какова действительная логика в отношении очистки контекста HashMap и как можно предотвратить его перегрузку?

1 Ответ

0 голосов
/ 26 октября 2018

Пример, на который вы ссылаетесь, является частью mapstruct-mapping-with-циклов , и там он не используется в качестве Spring bean.

Идея CycleAvoidingMapperContext должен использоваться как атрибут @Context.

Вы будете создавать новый экземпляр каждый раз, когда будете передавать его методу сопоставления.

...