有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何用抽象字段将平面对象映射到深度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

致:

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; }

添加到模型类(出于基本好奇),并重新定义属性映射器,使其具有:

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

它填充了dto.getNested(),但没有填充dto.getNested().getHeight()

这可以通过ModelMapper实现吗

谢谢你的建议


共 (1) 个答案

  1. # 1 楼答案

    事实证明,除了拥有一个提供程序并手动列出所有平面到嵌套属性之外,没有其他方法可以配置映射器。因为我想避免这种情况,我被下面的转换器卡住了:

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