如何使用 ModelMapper 映射对象树

How to map an object tree using ModelMapper

我正在尝试使用 ModelMapper 映射对象树。

我创建了一个示例来说明我的问题:

代码:

@Test
public class TestCase {

  ModelMapper modelMapper = new ModelMapper();

  class Source {
    String value1 = "1.0";
    Sub sub = new Sub();
  }

  class Sub {
    String sub1 = "2.0";
    String sub2 = "3";
  }

  class Destination {
    float numberOne;
    double numberTwo;
    int numberThree;
  }

  TestCase() {
    modelMapper.addMappings(new PropertyMap<Sub, Destination>() {
        @Override
        protected void configure() {
            map(source.sub1, destination.numberTwo);
            map(source.sub2, destination.numberThree);
        }
    });
    modelMapper.addMappings(new PropertyMap<Source, Destination>() {
        @Override
        protected void configure() {
            map(source.value1, destination.numberOne);
            // map(source.sub, destination); // this causes an exception
        }
    });
  }

  public void mapSub() { // works
    Destination destination = new Destination();
    modelMapper.map(new Sub(), destination);
    assertEquals(destination.numberTwo, 2d);
    assertEquals(destination.numberThree, 3);
  }

  public void mapSource() { // how to make this work?
    Destination destination = new Destination();
    modelMapper.map(new Source(), destination);
    assertEquals(destination.numberOne, 1f);
    assertEquals(destination.numberTwo, 2d);
    assertEquals(destination.numberThree, 3);
  }
}

我正在寻找一种配置单个 ModelMapper 实例以满足以下约束的方法:

  1. modelMapper 能够将类型 Sub 的对象转换为 Destination
  2. modelMapper 能够将类型 Source 的对象转换为 Destination
  3. Sub 中属性的映射仅声明一次

不幸的是,map(source.sub, destination); 行似乎无法正常工作。

我的真实世界场景包含一个更大的对象树,具有更多的属性和类型转换。这就是我尽量避免冗余映射信息的原因。

是否可以满足约束条件?

我们正在努力通过引入新的 API 来支持这一点。

typeMap.include(Source::getSub, Sub.class)

这个新的 API 将包含在下一个版本中。 坏消息是您需要此字段的 getter。

请参阅 github 上的问题 #354 and the pull request #358 了解更多详情。