Как сопоставить плоский объект с глубоким DTO с абстрактными полями?

У меня есть следующий класс модели:

@Data
public class M {
  private String name;
  private int age;
  private int height;
}

и следующий класс Dto:

@Data
public class Dto {
  private String name;
  private B nested;
}

@Data
public class C extends B {
  private int height;
}

где B — абстрактный класс:

@Data
public abstract class B {
  private int age;
}

Я хотел бы использовать ModelMapper для перевода экземпляра модели в экземпляр Dto со свойствами возраста и высоты модели, переведенными в правильно заполненный объект C.

Пример:

model = { name: "Steve", age: 35, height: 185 } of Model

to:

dto = { name: "Steve", nested: { age: 35, height: 185 } of C } of Dto

Я пробовал следующее:

mapper.createTypeMap(Model.class, Dto.class).addMappings(new PropertyMap<Model, Dto>() {
  @Override
  protected void configure() {
    map(source, destination.getNested());
  }
});

mapper.createTypeMap(Model.class, C.class);

заканчивая dto.getNested() == null.

Также пытался добавить

public Model getSelf() { return this; }

в класс Model (из простого любопытства) и переопределите средство сопоставления свойств, чтобы оно имело:

with(new Provider<C>(req => new C())).map(source.getSelf(), destination.getNested());

который заполнил dto.getNested(), но не заполнил dto.getNested().getHeight().

Это достижимо с ModelMapper?

Спасибо за все советы.


person kataik    schedule 22.03.2019    source источник


Ответы (1)


Как оказалось, нет другого способа настроить маппер, кроме как иметь провайдера и вручную перечислить все свойства flat-to-nested. Поскольку я хотел избежать этого, я застрял с конвертером ниже:

    Converter<M, C> converter = new Converter<M, C>() {
        @Override
        public C convert(MappingContext<M, C> context) {
            C c = new C();
            mapper.map(context.getSource(), c);
            return c;
        }
    };

, и используйте этот преобразователь в конфигурации M в Dto, чтобы сопоставить source с destination.getNested(). Это также предполагает, что конвертер должен иметь доступ к картографу. Мех.

person kataik    schedule 26.03.2019