Игнорировать дочерний объект, кроме специально сопоставленных свойств - PullRequest
1 голос
/ 15 января 2020

Есть ли способ настроить сопоставление MapStruct для игнорирования дочернего объекта, но при этом сопоставить специфицированное c свойство дочернего объекта?

Например:

@Mapper
interface PersonMapper {
    @Mapping(target = "organization", ignore = true) // ignore organization
    @Mapping(source = "organizationId", target = "organization.id") // except organization.id
    Person toEntity(PersonModel model);
}

This Кстати, цель organization не равна нулю и имеет поле id, установленное из поля organizationId источника. В настоящее время этот подход, по-видимому, отдает приоритет игнорируемому дочернему элементу organization, и свойство остается как null.

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

1 Ответ

2 голосов
/ 20 января 2020

В настоящее время невозможно достичь того, что вы ищете, без добавления дополнительного метода сопоставления с аннотациями.

Когда используется

@Mapping(target = "organization", ignore = true)

, независимо от того, что вы делаете с вложенные отображения для organization, все свойство organization игнорируется.

Однако вы можете достичь того, что вам нужно, если вы выполните следующее:

@Mapper
interface PersonMapper {
    @Mapping(target = "organization", source = "model"
    Person toEntity(PersonModel model);

    @BeanMaping(ignoreByDefault = true)
    @Mapping(target = "id", source = "organizationId")
    Organization toOrganizationEntity(PersonModel model)
}

Что мы только что сделали сейчас:

  1. Мы добавили пользовательскую модель toOrganizationEntity из PersonModel в Organization
  2. Мы сказали, что сопоставляем исходный параметр для модели (из toEntity) в организация
  3. Мы игнорируем все свойства для отображения цели в toOrganizationEntity
  4. Мы явно отображаем organizationId в id Organization.

Если вы не хотите предоставлять метод publi c на своем интерфейсе PersonMapper, вы можете использовать абстрактный класс.

@Mapper
public class PersonMapper {
    @Mapping(target = "organization", source = "model"
    public abstract Person toEntity(PersonModel model);

    @BeanMaping(ignoreByDefault = true)
    @Mapping(target = "id", source = "organizationId")
    protected abstract Organization toOrganizationEntity(PersonModel model)
}
...