Включить контекст Mapstruct во внутренние средства отображения - PullRequest
0 голосов
/ 04 марта 2019

Я использую MapStruct 1.3.0.Final для преобразования Dtos в POJO и наоборот со значением spring в mapstruct.defaultComponentModel .Чтобы избежать ошибок переполнения стека из-за двунаправленных отношений, я перешел по следующей ссылке:

Отображение с циклами

Однако фаза компиляции (для генерации реализаций) принимаетмного времени (всего 20 файлов за 15 минут, и мне нужно включить больше).

Я не могу "повторно использовать" существующие средства отображения, потому что я не могу "отправить" тогда контекст, используя:

@Mapper(uses=B_Mapper.class)
A_Mapper ...

Итак, есть ли возможность оптимизации, чтобы сократить количество требуемого времени?Есть ли способ передать контекст во «внутренние сопоставители» (в приведенном выше примере B_Mapper )?

UPDATE

То естьскелет приложения:

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

1 Ответ

0 голосов
/ 04 марта 2019

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

...