如何使用ModelMapper映射对象树

时间:2018-06-13 16:16:18

标签: java modelmapper

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

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

  • 班级Sub包含多个属性。
  • Source包含Sub类型的对象和(至少)另一个属性。
  • 班级Destination包含一系列属性。
  • 源和目标属性的类型不同。

代码:

@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中的属性映射仅声明一次
  4. 不幸的是,行map(source.sub, destination);似乎没有按预期工作。

    我的真实场景包含一个更大的对象树,其中包含更多属性和类型转换。这就是为什么我试图避免冗余映射信息的原因。

    是否可以满足约束条件?

1 个答案:

答案 0 :(得分:0)

我们正在通过引入新的API来为此提供支持。

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

此新API将包含在下一个版本中。 不幸的是,您需要使用此字段的吸气剂。

有关更多详细信息,请参阅github上的问题#354和拉取请求#358