如何使用抽象字段将平面对象映射到深层DTO?

时间:2019-03-22 22:38:13

标签: java modelmapper

我有以下模型类:

@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实例,并将模型的age和height属性转换为正确填充的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 :(得分:0)

事实证明,除了拥有提供程序并手动列出所有从平面嵌套的属性外,没有其他方法可以配置映射器。由于我想避免这种情况,所以我陷入了下面的转换器中:

    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()。这也假定转换器需要访问映射器。嗯。