当前位置: 首页 > 知识库问答 >
问题:

如何使用ModelMapper映射对象树

姜业
2023-03-14

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

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

  • 类包含多个属性
  • 类包含类型为Sub的对象和(至少)另一个属性
  • 类目标包含一个简单的属性列表
  • 源属性和目标属性的类型不同

代码:

@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类型的对象转换为目标对象

不幸的是,行<代码>映射(source.sub,destination) 似乎没有按预期工作。

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

是否有可能满足约束条件?

共有1个答案

梁骞仕
2023-03-14

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

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

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

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

 类似资料:
  • 我正在使用下面的代码片段映射对象 它没有映射,但当我添加这个时,它工作得很好 但却无法理解它的功能<代码>导入={Instant.class,DateTimeFormatter.class}它如何帮助映射对象?

  • 问题内容: 假设我有课: 我想将其翻译为object : 使用默认的ModelMapper设置,我可以通过以下方式实现: 但是,可能会发生该对象。在这种情况下,MyTarget还将是: 我想以这种方式指定自定义映射,(伪代码): 有人知道如何编写适当的转换器来实现这一目标吗? 问题答案: 无法直接使用ModelMapper,因为ModelMapper 方法会检查source是否为null,在这种情

  • 我的班级等级如下: 并尝试将DTO映射到实体 地图如下: 我在详细信息字段中收到带有A或B的DTO,这是在调试器中检查的。但是模型制图者投掷 无法实例化目标组织的实例。包裹基础确保该组织。包裹Base有一个非私有的无参数构造函数。 我尝试使用显式提供程序(没有用于此映射): 我还尝试像这样实现自定义转换器(也没有执行): 模型映射器似乎没有对字段使用这个类型映射,只对hierarhy的根使用。在这

  • 你好,我有下一个json响应: 正如你所见,我有一个资源对象,里面有许多不同的对象,但这些对象可能会根据输入的不同而有所不同。我创建了下一个pojo: 在我的输入Pojo中: 导入java。util。列表 我将资源添加为对象列表,但我可以看到它是一个对象,其中包含不同的对象。如何将这些不同的对象映射到Java中的对象?事实上,我需要计算我有多少资源,但我正在努力实现这一目标。谢谢!

  • 问题内容: 我们有一张有很多列的大桌子。移至MySQL Cluster后,由于以下原因无法创建表: 错误1118(42000):行大小太大。不包括BLOB在内的已使用表类型的最大行大小为14000。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB 举个例子: 这是用于存储配置参数的表。我在想,我们可以将一些列合并为一个列,并将其存储为JSON对象,然后将其转换为Java对象。 例

  • 假设我有一个Foo对象列表。Foo上有一个属性,我必须使用它从数据源中获取Bar对象。然后我必须将每个bar对象映射回我得到bar的原始Foo对象。 我的尝试如下: