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

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

@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 для преобразования экземпляра Model в экземпляр Dto, когда свойства возраста и высоты модели переведены в объект C, правильно заполненный.

Пример:

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

до:

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?

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

1 Ответ

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

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

    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 to Dto для отображения source в destination.getNested().Это также предполагает, что конвертер должен иметь доступ к мапперу.Мех.

...