Настраиваемое сопоставление структур классов с ModelMapper - PullRequest
0 голосов
/ 21 апреля 2020

У меня проблема с ModelMapper

Давайте представим, что у меня есть такая структура класса:

Поля MainModel: - ChildModel - (некоторые другие общие поля c)

Поля ChildModel: - Список - (некоторые другие общие c поля)

У меня есть структура DTO, которая выглядит точно так же (MainDTO, ChildDTO и GrandChildDTO). Преобразование работает нормально в обоих направлениях при нормальных условиях.

Однако у меня есть несколько ситуаций, когда я хочу прочитать MainModel с ChildModel из БД, не получая все объекты GrandChildModel из БД (LazyLoading сделает это здесь).

Для ModelMapper я добавил пользовательский ModelMapper, который имеет что-то вроде этого (примите его как псевдокод, я изменил название !!):

TypeMap<ChildModel, ChildDTO> typeMap = modelMapper.createTypeMap(ChildModel.class, ChildDTO.class);
typeMap.addMappings(mapper -> mapper.skip(ChildDTO::setGrandChildren));

Когда я создаю экземпляры ChildModel и преобразуйте их напрямую с моим экземпляром ModelMapper, они преобразуются просто отлично, GrandChildren пропускаются, как и ожидалось ...

Однако, если я выполняю сопоставление с MainModel -> MainDTO, ModelMapper НИКОГДА не использует добавленную мной пользовательскую конфигурацию. Я даже пытался добавить пользовательский конвертер для ChildModel-> ChildDTO вместо пропуска с TypeMap, это приводит к тому же результату. Я даже могу отладить и увидеть, что пользовательский конвертер для ChildModel никогда не вызывается, когда я конвертирую MainModel-> MainDTO, поэтому, похоже, ModelMapper использует для этого механизм преобразования внутреннего стандарта.

Есть ли способ, как я могу это исправить ? Это нормальное поведение ModelMapper?

Я знаю, что я мог бы просто вызвать setGrandChildren (null) в модели, поэтому отображение будет работать, но кажется несколько уродливым связываться с моделью (что в теории - не мое case-- может быть сохранен снова позже и будет сломан).

...